Zoeken…


Maak een XML-bestand met XMLWriter

Instantiate een XMLWriter-object:

$xml = new XMLWriter();

Open vervolgens het bestand waarnaar u wilt schrijven. Als u bijvoorbeeld naar /var/www/example.com/xml/output.xml wilt schrijven, gebruikt u:

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

Om het document te starten (maak de XML open tag):

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

Dit levert het volgende op:

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

Nu kunt u beginnen met het schrijven van elementen:

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

Dit genereert de XML:

<foo>bar</foo>

Als u iets complexers nodig hebt dan alleen knooppunten met eenvoudige waarden, kunt u ook een element "starten" en daaraan attributen toevoegen voordat u het sluit:

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

Dit levert het volgende op:

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

Lees een XML-document met DOMDocument

Net als bij SimpleXML kunt u DOMDocument gebruiken om XML te parseren uit een string of uit een XML-bestand

1. Uit een string

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

2. Uit een bestand

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

Voorbeeld van parseren

Overweegt de volgende 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>

Dit is een voorbeeldcode om deze te ontleden

$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");
}

Dit levert het volgende op:

De titel van boek 1 is PHP - een introductie en kost $ 5,95.

De titel van boek 2 is PHP - Advanced en kost $ 25,00.

Maak een XML met behulp van DomDocument

Om een XML te maken met behulp van DOMDocument, moeten we eigenlijk alle tags en attributen maken met de createElement() en createAttribute() en deze maken de XML-structuur met de appendChild() .

Het onderstaande voorbeeld bevat tags, attributen, een CDATA-sectie en een andere naamruimte voor de tweede tag:

$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());

Hiermee wordt de volgende XML uitgevoerd:

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

Lees een XML-document met SimpleXML

U kunt XML ontleden uit een string of uit een XML-bestand

1. Uit een string

$xml_obj = simplexml_load_string($string);

2. Uit een bestand

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

Voorbeeld van parseren

Overweegt de volgende 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>

Dit is een voorbeeldcode om deze te ontleden

$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");
}

Dit levert het volgende op:

De titel van boek 1 is PHP - een introductie en kost $ 5,95.
De titel van boek 2 is PHP - Advanced en kost $ 25,00.

Gebruikmaken van XML met PHP's SimpleXML-bibliotheek

SimpleXML is een krachtige bibliotheek die XML-strings converteert naar een eenvoudig te gebruiken PHP-object.

Het volgende gaat uit van een XML-structuur zoals hieronder.

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

Lees onze gegevens in SimpleXML

Om te beginnen moeten we onze gegevens in SimpleXML lezen. We kunnen dit op 3 verschillende manieren doen. Ten eerste kunnen we onze gegevens laden vanaf een DOM-knooppunt.

$xmlElement = simplexml_import_dom($domNode);

Onze volgende optie is om onze gegevens te laden vanuit een XML-bestand.

$xmlElement = simplexml_load_file($filename);

Ten slotte kunnen we onze gegevens laden vanuit een variabele.

$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);

Of u nu hebt gekozen om te laden vanuit een DOM-element , een bestand of een string , u hebt nu nog een SimpleXMLElement-variabele genaamd $xmlElement . Nu kunnen we beginnen met het gebruik van onze XML in PHP.

Toegang tot onze SimpleXML-gegevens

De eenvoudigste manier om toegang te krijgen tot gegevens in ons SimpleXMLElement-object is om de eigenschappen rechtstreeks aan te roepen . Als we toegang willen krijgen tot onze eerste bookName, StackOverflow SimpleXML Example , dan kunnen we deze openen zoals hieronder.

echo $xmlElement->book->bookName;

Op dit punt gaat SimpleXML ervan uit dat, omdat we niet expliciet hebben verteld welk boek we willen, we het eerste willen. Als we echter besluiten dat we de eerste niet willen, in plaats dat we Another SimpleXML Example , kunnen we deze openen zoals hieronder.

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

Het is vermeldenswaard dat het gebruik van [0] hetzelfde werkt als het niet gebruiken, dus

$xmlElement->book

werkt hetzelfde als

$xmlElement->book[0]

Loop door onze XML

Er zijn veel redenen waarom u XML wilt doorlopen , zoals dat u in ons geval een aantal items, boeken die we op een webpagina willen weergeven, heeft. Hiervoor kunnen we een foreach-lus of een standaard voor lus gebruiken , gebruikmakend van de graaffunctie van SimpleXMLElement. .

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

of

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

Fouten afhandelen

Nu we zover zijn gekomen, is het belangrijk om te beseffen dat we alleen maar mensen zijn en uiteindelijk waarschijnlijk een fout zullen tegenkomen - vooral als we de hele tijd met verschillende XML-bestanden spelen. En dus zullen we die fouten willen aanpakken.

Overweeg dat we een XML-bestand hebben gemaakt. U zult merken dat, hoewel deze XML veel lijkt op wat we eerder hadden, het probleem met dit XML-bestand is dat de laatste afsluitende tag / doc is in plaats van / 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>

Laten we nu zeggen dat we dit in ons PHP laden als $ -bestand.

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';
}

We zullen met het volgende worden begroet

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

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

Zodra we dit probleem oplossen, krijgen we echter "Happy Days" te zien.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow