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”.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow