Szukaj…
Utwórz plik XML za pomocą XMLWriter
Utwórz instancję obiektu XMLWriter:
$xml = new XMLWriter();
Następnie otwórz plik, do którego chcesz zapisać. Na przykład, aby napisać do /var/www/example.com/xml/output.xml
, użyj:
$xml->openUri('file:///var/www/example.com/xml/output.xml');
Aby uruchomić dokument (utwórz otwarty znacznik XML):
$xml->startDocument('1.0', 'utf-8');
Spowoduje to wygenerowanie:
<?xml version="1.0" encoding="UTF-8"?>
Teraz możesz zacząć pisać elementy:
$xml->writeElement('foo', 'bar');
To wygeneruje XML:
<foo>bar</foo>
Jeśli potrzebujesz czegoś nieco bardziej złożonego niż zwykłe węzły o prostych wartościach, możesz także „uruchomić” element i dodać do niego atrybuty przed zamknięciem:
$xml->startElement('foo');
$xml->writeAttribute('bar', 'baz');
$xml->writeCdata('Lorem ipsum');
$xml->endElement();
Spowoduje to wygenerowanie:
<foo bar="baz"><![CDATA[Lorem ipsum]]></foo>
Przeczytaj dokument XML za pomocą DOMDocument
Podobnie jak w SimpleXML, możesz użyć DOMDocument do parsowania XML z łańcucha lub pliku XML
1. Z łańcucha
$doc = new DOMDocument();
$doc->loadXML($string);
2. Z pliku
$doc = new DOMDocument();
$doc->load('books.xml');// use the actual file path. Absolute or relative
Przykład parsowania
Biorąc pod uwagę następujący kod 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>
To jest przykładowy kod do jego analizy
$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");
}
Spowoduje to wygenerowanie:
Tytuł książki 1 to PHP - Wprowadzenie i kosztuje 5,95 USD.
Tytuł książki 2 to PHP - Advanced i kosztuje 25,00 USD.
Utwórz XML za pomocą DomDocument
Aby utworzyć XML za pomocą DOMDocument, w zasadzie musimy utworzyć wszystkie tagi i atrybuty za pomocą metod createElement()
i createAttribute()
, a one utworzą strukturę XML za pomocą appendChild()
.
Poniższy przykład zawiera tagi, atrybuty, sekcję CDATA i inną przestrzeń nazw dla drugiego tagu:
$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());
Spowoduje to wyświetlenie następującego pliku 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>
Przeczytaj dokument XML za pomocą SimpleXML
Możesz parsować XML z ciągu znaków lub z pliku XML
1. Z łańcucha
$xml_obj = simplexml_load_string($string);
2. Z pliku
$xml_obj = simplexml_load_file('books.xml');
Przykład parsowania
Biorąc pod uwagę następujący kod 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>
To jest przykładowy kod do jego analizy
$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");
}
Spowoduje to wygenerowanie:
Tytuł książki 1 to PHP - Wprowadzenie i kosztuje 5,95 USD.
Tytuł książki 2 to PHP - Advanced i kosztuje 25,00 USD.
Wykorzystanie XML z biblioteką SimpleXML PHP
SimpleXML to potężna biblioteka, która konwertuje ciągi XML na łatwy w obsłudze obiekt PHP.
Poniżej założono strukturę XML jak poniżej.
<?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>
Przeczytaj nasze dane w SimpleXML
Aby rozpocząć, musimy odczytać nasze dane do SimpleXML. Możemy to zrobić na 3 różne sposoby. Po pierwsze, możemy załadować nasze dane z węzła DOM.
$xmlElement = simplexml_import_dom($domNode);
Naszą kolejną opcją jest załadowanie naszych danych z pliku XML.
$xmlElement = simplexml_load_file($filename);
Wreszcie możemy załadować nasze dane ze zmiennej.
$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);
Niezależnie od tego, czy wybrałeś ładowanie z elementu DOM , pliku czy ciągu , pozostała Ci zmienna SimpleXMLElement o nazwie $xmlElement
. Teraz możemy zacząć korzystać z naszego XML w PHP.
Dostęp do naszych danych SimpleXML
Najprostszym sposobem na dostęp do danych w naszym obiekcie SimpleXMLElement jest bezpośrednie wywołanie właściwości . Jeśli chcemy uzyskać dostęp do naszego pierwszego bookName, StackOverflow SimpleXML Example
, możemy uzyskać do niego dostęp zgodnie z poniższym opisem.
echo $xmlElement->book->bookName;
W tym momencie SimpleXML przyjmie, że ponieważ nie powiedzieliśmy jednoznacznie, której książki chcemy, że chcemy pierwszej. Jeśli jednak zdecydujemy, że nie chcemy pierwszego, a raczej Another SimpleXML Example
, możemy uzyskać do niego dostęp zgodnie z poniższym opisem.
echo $xmlElement->book[1]->bookName;
Warto zauważyć, że użycie [0]
działa tak samo, jak nieużywanie go, więc
$xmlElement->book
działa tak samo jak
$xmlElement->book[0]
Pętla przez nasz XML
Istnieje wiele powodów, dla których możesz chcieć przeszukiwać XML , na przykład, że masz wiele pozycji, w naszym przypadku książek, które chcielibyśmy wyświetlić na stronie internetowej. W tym celu możemy użyć pętli foreach lub standardowej pętli , korzystając z funkcji liczenia SimpleXMLElement. .
foreach ( $xmlElement->book as $thisBook ) {
echo $thisBook->bookName
}
lub
$count = $xmlElement->count();
for ( $i=0; $i<$count; $i++ ) {
echo $xmlElement->book[$i]->bookName;
}
Obsługa błędów
Teraz, jak doszliśmy do tej pory, ważne jest, aby zdawać sobie sprawę, że jesteśmy tylko ludźmi i prawdopodobnie w końcu napotkamy błąd - szczególnie, jeśli cały czas bawimy się różnymi plikami XML. I tak będziemy chcieli poradzić sobie z tymi błędami.
Rozważmy, że stworzyliśmy plik XML. Zauważysz, że chociaż ten XML jest podobny do tego, co mieliśmy wcześniej, problem z tym plikiem XML polega na tym, że końcowym znacznikiem zamykającym jest / doc zamiast / 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>
Powiedzmy, że ładujemy to do naszego PHP jako plik $.
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';
}
Zostaniemy przywitani następującymi
FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc
Line: 13
Column: 10
File: filepath/filename.xml
Jednak jak tylko naprawimy ten problem, pojawi się „Happy Days”.