Поиск…
Создание 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
Однако, как только мы исправим эту проблему, нам вручают «Счастливые дни».