Поиск…


Создание XML-файла с использованием XMLWriter

Создавать экземпляр объекта XMLWriter:

$xml = new XMLWriter();

Затем откройте файл, который вы хотите записать. Например, чтобы написать в /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>

Чтение XML-документа с помощью DOMDocument

Подобно 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 долларов США.

Создание XML с помощью DomDocument

Чтобы создать XML с использованием DOMDocument, в основном нам нужно создать все теги и атрибуты с помощью методов createElement() и createAttribute() и они создают структуру XML с помощью appendChild() .

Пример ниже включает теги, атрибуты, раздел 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>

Прочитать XML-документ с помощью SimpleXML

Вы можете анализировать 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 долларов США.

Использование XML в библиотеке SimpleXML для PHP

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. Мы можем сделать это тремя разными способами. Во-первых, мы можем загрузить наши данные с узла 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 , из файла или из строки , теперь вы остаетесь с переменной SimpleXMLElement с именем $xmlElement . Теперь мы можем начать использовать наш XML в PHP.

Доступ к данным SimpleXML

Самый простой способ получить доступ к данным в нашем объекте SimpleXMLElement - это вызвать свойства напрямую . Если мы хотим получить доступ к нашему первому bookName, StackOverflow SimpleXML Example , тогда мы получим доступ к нему, как 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 , например, у вас есть несколько предметов, книг в нашем случае, которые мы хотели бы отобразить на веб-странице. Для этого мы можем использовать цикл foreach или стандарт для цикла , используя функцию подсчета SimpleXMLElement. ,

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-файлом заключается в том, что заключительным закрывающим тегом является / doc вместо / document.

<?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