수색…


XMLWriter를 사용하여 XML 파일 만들기

XMLWriter 객체를 인스턴스화합니다.

$xml = new XMLWriter();

그런 다음 작성하려는 파일을 엽니 다. 예를 들어 /var/www/example.com/xml/output.xml 에 쓰려면 /var/www/example.com/xml/output.xml 을 사용합니다.

$xml->openUri('file:///var/www/example.com/xml/output.xml');

문서를 시작하려면 (XML 열기 태그 만들기) :

$xml->startDocument('1.0', 'utf-8');

그러면 다음과 같이 출력됩니다.

<?xml version="1.0" encoding="UTF-8"?>

이제 요소 작성을 시작할 수 있습니다.

$xml->writeElement('foo', 'bar');

이렇게하면 XML이 생성됩니다.

<foo>bar</foo>

일반 값을 가진 단순한 노드보다 좀 더 복잡한 것이 필요한 경우 요소를 닫고 닫기 전에 요소를 "시작"하고 속성을 추가 할 수도 있습니다.

$xml->startElement('foo');
$xml->writeAttribute('bar', 'baz');
$xml->writeCdata('Lorem ipsum');
$xml->endElement();

그러면 다음과 같이 출력됩니다.

<foo bar="baz"><![CDATA[Lorem ipsum]]></foo>

DOMDocument를 사용하여 XML 문서 읽기

SimpleXML과 마찬가지로 DOMDocument를 사용하여 문자열이나 XML 파일에서 XML을 파싱 할 수 있습니다.

1. 문자열에서

$doc = new DOMDocument();
$doc->loadXML($string);

2. 파일에서

$doc = new DOMDocument();
$doc->load('books.xml');// use the actual file path. Absolute or relative

파싱의 예

다음 XML을 고려하십시오.

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
      <name>PHP - An Introduction</name>
      <price>$5.95</price>
      <id>1</id>
   </book>
   <book>
      <name>PHP - Advanced</name>
      <price>$25.00</price>
      <id>2</id>
   </book>
</books>

이것을 파싱하는 예제 코드입니다.

$books = $doc->getElementsByTagName('book');
foreach ($books as $book) {
    $title = $book->getElementsByTagName('name')->item(0)->nodeValue;
    $price = $book->getElementsByTagName('price')->item(0)->nodeValue;
    $id = $book->getElementsByTagName('id')->item(0)->nodeValue;
    print_r ("The title of the book $id is $title and it costs $price." . "\n");
}

그러면 다음과 같이 출력됩니다.

도서 1의 제목은 PHP - 소개이며 $ 5.95입니다.

도서 2의 제목은 PHP - Advanced이며 비용은 $ 25입니다.

DomDocument를 사용하여 XML 만들기

DOMDocument를 사용하여 XML을 작성하려면 기본적으로 createElement()createAttribute() 메소드를 사용하여 모든 태그 및 속성을 작성해야하며 appendChild() 사용하여 XML 구조를 작성해야합니다.

아래 예제는 태그, 속성, CDATA 섹션 및 두 번째 태그에 대한 다른 네임 스페이스를 포함합니다.

$dom = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

//create the main tags, without values
$books = $dom->createElement('books');
$book_1 = $dom->createElement('book');

// create some tags with values
$name_1 = $dom->createElement('name', 'PHP - An Introduction');
$price_1 = $dom->createElement('price', '$5.95');
$id_1 = $dom->createElement('id', '1');

//create  and append an attribute
$attr_1 = $dom->createAttribute('version');
$attr_1->value = '1.0';
//append the attribute
$id_1->appendChild($attr_1);

//create the second tag book with different namespace
$namespace = 'www.example.com/libraryns/1.0';

//include the namespace prefix in the books tag
$books->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns', $namespace);
$book_2 = $dom->createElementNS($namespace,'ns:book');
$name_2 = $dom->createElementNS($namespace, 'ns:name');

//create a CDATA section (that is another DOMNode instance) and put it inside the name tag
$name_cdata = $dom->createCDATASection('PHP - Advanced');
$name_2->appendChild($name_cdata);
$price_2 = $dom->createElementNS($namespace, 'ns:price', '$25.00');
$id_2 = $dom->createElementNS($namespace, 'ns:id', '2');

//create the XML structure
$books->appendChild($book_1);
$book_1->appendChild($name_1);
$book_1->appendChild($price_1);
$book_1->appendChild($id_1);
$books->appendChild($book_2);
$book_2->appendChild($name_2);
$book_2->appendChild($price_2);
$book_2->appendChild($id_2);

$dom->appendChild($books);

//saveXML() method returns the XML in a String
print_r ($dom->saveXML());

그러면 다음 XML이 출력됩니다.

<?xml version="1.0" encoding="utf-8"?>
<books xmlns:ns="www.example.com/libraryns/1.0">
  <book>
    <name>PHP - An Introduction</name>
    <price>$5.95</price>
    <id version="1.0">1</id>
  </book>
  <ns:book>
    <ns:name><![CDATA[PHP - Advanced]]></ns:name>
    <ns:price>$25.00</ns:price>
    <ns:id>2</ns:id>
  </ns:book>
</books>

SimpleXML로 XML 문서 읽기

문자열 또는 XML 파일에서 XML을 구문 분석 할 수 있습니다.

1. 문자열에서

$xml_obj = simplexml_load_string($string);

2. 파일에서

$xml_obj = simplexml_load_file('books.xml');

파싱의 예

다음 XML을 고려하십시오.

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
      <name>PHP - An Introduction</name>
      <price>$5.95</price>
      <id>1</id>
   </book>
   <book>
      <name>PHP - Advanced</name>
      <price>$25.00</price>
      <id>2</id>
   </book>
</books>

이것을 파싱하는 예제 코드입니다.

$xml = simplexml_load_string($xml_string);
$books = $xml->book;
foreach ($books as $book) {
    $id = $book->id;
    $title = $book->name;
    $price = $book->price;
    print_r ("The title of the book $id is $title and it costs $price." . "\n");
}

그러면 다음과 같이 출력됩니다.

도서 1의 제목은 PHP - 소개이며 $ 5.95입니다.
도서 2의 제목은 PHP - Advanced이며 비용은 $ 25입니다.

PHP의 SimpleXML 라이브러리를 이용한 XML 활용

SimpleXML은 XML 문자열을 사용하기 쉬운 PHP 객체로 변환하는 강력한 라이브러리입니다.

다음은 XML 구조를 다음과 같이 가정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</document>

SimpleXML로 데이터 읽어 들이기

시작하려면 데이터를 SimpleXML로 읽어야합니다. 우리는 3 가지 방법으로 이것을 할 수 있습니다. 먼저 DOM 노드에서 데이터를로드 할 수 있습니다 .

$xmlElement = simplexml_import_dom($domNode);

다음 옵션은 XML 파일에서 데이터로드하는 것입니다.

$xmlElement = simplexml_load_file($filename);

마지막으로 변수에서 데이터를로드 할 수 있습니다 .

$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</document>';
$xmlElement = simplexml_load_string($xmlString);

DOM 요소 , 파일 또는 문자열 에서로드를 선택했는지 여부에 관계없이 $xmlElement 라는 SimpleXMLElement 변수가 $xmlElement 있습니다. 이제 우리는 PHP로 XML을 사용할 수 있습니다.

SimpleXML 데이터에 액세스

SimpleXMLElement 객체에서 데이터에 액세스하는 가장 간단한 방법 은 속성을 직접 호출하는 것 입니다. 첫 번째 bookName, StackOverflow SimpleXML Example 에 액세스하려면 다음과 같이 액세스 할 수 있습니다.

echo $xmlElement->book->bookName;

이 시점에서 SimpleXML은 우리가 원하는 책을 명시 적으로 말하지 않았으므로 첫 번째 책을 원한다고 가정합니다. 그러나 우리가 처음 Another SimpleXML Example 을 원하지 않는다고 결정하면, 우리는 Another SimpleXML Example 원한다. 우리는 다음과 같이 접근 할 수있다.

echo $xmlElement->book[1]->bookName;

[0] 사용하면 사용하지 않는 것과 똑같이 작동한다는 점은 주목할 가치가 있습니다.

$xmlElement->book

같은

$xmlElement->book[0]

XML을 통해 루핑하기

XML을 통해 반복 하려는 여러 가지 이유가 있습니다. 예를 들어, 우리가 웹 페이지에 표시하고자하는 많은 항목과 책이 있습니다. 이를 위해 우리는 SimpleXMLElement의 count 함수를 이용하여 foreach 루프 나 표준 for 루프를 사용할 수 있습니다. .

foreach ( $xmlElement->book as $thisBook ) {
    echo $thisBook->bookName
}

또는

$count = $xmlElement->count();
for ( $i=0; $i<$count; $i++ ) {
    echo $xmlElement->book[$i]->bookName;
}

오류 처리

이제 우리는 지금까지 왔으며, 우리는 단지 인간이라는 사실을 깨닫는 것이 중요합니다. 특히 다른 XML 파일로 항상 놀고 있다면 오류가 발생할 가능성이 큽니다. 그래서 우리는 이러한 오류를 처리하기를 원할 것입니다.

XML 파일을 만들었다 고 가정 해 봅시다. 이 XML은 우리가 전에 가지고 있었던 것과 거의 유사하지만이 XML 파일의 문제점은 마지막 닫는 태그가 / document가 아닌 / doc라는 점입니다.

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</doc>

자, 말하자면 PHP 파일에 $ file을로드합니다.

libxml_use_internal_errors(true);
$xmlElement = simplexml_load_file($file);
if ( $xmlElement === false ) {
    $errors = libxml_get_errors();
    foreach ( $errors as $thisError ) {
        switch ( $thisError->level ) {
            case LIBXML_ERR_FATAL:
                echo "FATAL ERROR: ";
                break;
            case LIBXML_ERR_ERROR:
                echo "Non Fatal Error: ";
                break;
            case LIBXML_ERR_WARNING:
                echo "Warning: ";
                break;
        }
        echo $thisError->code . PHP_EOL .
            'Message: ' . $thisError->message . PHP_EOL .
            'Line: ' . $thisError->line . PHP_EOL .
            'Column: ' . $thisError->column . PHP_EOL .
            'File: ' . $thisError->file;
    }
    libxml_clear_errors();
} else {
    echo 'Happy Days';
}

우리는 다음과 같이 인사 할 것입니다.

FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc

Line: 13
Column: 10
File: filepath/filename.xml

그러나이 문제를 해결하자마자 "행복한 날들"이 표시됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow