Recherche…
Créer un fichier XML à l'aide de XMLWriter
Instanciez un objet XMLWriter:
$xml = new XMLWriter();
Ensuite, ouvrez le fichier dans lequel vous souhaitez écrire. Par exemple, pour écrire dans /var/www/example.com/xml/output.xml
, utilisez:
$xml->openUri('file:///var/www/example.com/xml/output.xml');
Pour démarrer le document (créer la balise ouverte XML):
$xml->startDocument('1.0', 'utf-8');
Cela va sortir:
<?xml version="1.0" encoding="UTF-8"?>
Maintenant, vous pouvez commencer à écrire des éléments:
$xml->writeElement('foo', 'bar');
Cela va générer le XML:
<foo>bar</foo>
Si vous avez besoin de quelque chose d'un peu plus complexe que simplement des nœuds avec des valeurs simples, vous pouvez également "démarrer" un élément et lui ajouter des attributs avant de le fermer:
$xml->startElement('foo');
$xml->writeAttribute('bar', 'baz');
$xml->writeCdata('Lorem ipsum');
$xml->endElement();
Cela va sortir:
<foo bar="baz"><![CDATA[Lorem ipsum]]></foo>
Lire un document XML avec DOMDocument
De même que pour SimpleXML, vous pouvez utiliser DOMDocument pour analyser le XML à partir d'une chaîne ou d'un fichier XML.
1. d'une chaîne
$doc = new DOMDocument();
$doc->loadXML($string);
2. À partir d'un fichier
$doc = new DOMDocument();
$doc->load('books.xml');// use the actual file path. Absolute or relative
Exemple d'analyse
Considérant le XML suivant:
<?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>
Ceci est un exemple de code pour l'analyser
$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");
}
Cela va sortir:
Le titre du livre 1 est PHP - An Introduction et coûte 5,95 $.
Le titre du livre 2 est PHP - Avancé et coûte 25,00 $.
Créer un fichier XML à l'aide de DomDocument
Pour créer un XML à l'aide de DOMDocument, nous devons créer tous les attributs et les balises à l'aide des createElement()
et createAttribute()
et créer la structure XML avec appendChild()
.
L'exemple ci-dessous inclut des balises, des attributs, une section CDATA et un espace de noms différent pour la deuxième balise:
$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());
Ceci affichera le XML suivant:
<?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>
Lire un document XML avec SimpleXML
Vous pouvez analyser XML à partir d'une chaîne ou d'un fichier XML
1. d'une chaîne
$xml_obj = simplexml_load_string($string);
2. À partir d'un fichier
$xml_obj = simplexml_load_file('books.xml');
Exemple d'analyse
Considérant le XML suivant:
<?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>
Ceci est un exemple de code pour l'analyser
$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");
}
Cela va sortir:
Le titre du livre 1 est PHP - An Introduction et coûte 5,95 $.
Le titre du livre 2 est PHP - Avancé et coûte 25,00 $.
Utilisation de XML avec la bibliothèque SimpleXML de PHP
SimpleXML est une bibliothèque puissante qui convertit les chaînes XML en un objet PHP facile à utiliser.
Ce qui suit suppose une structure XML comme ci-dessous.
<?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>
Lisez nos données dans SimpleXML
Pour commencer, nous devons lire nos données dans SimpleXML. Nous pouvons le faire de 3 manières différentes. Tout d'abord, nous pouvons charger nos données à partir d'un nœud DOM.
$xmlElement = simplexml_import_dom($domNode);
Notre option suivante consiste à charger nos données à partir d’un fichier XML.
$xmlElement = simplexml_load_file($filename);
Enfin, nous pouvons charger nos données à partir d’une variable.
$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);
Que vous ayez choisi de charger à partir d' un élément DOM , à partir d' un fichier ou d' une chaîne , vous disposez maintenant d'une variable SimpleXMLElement appelée $xmlElement
. Maintenant, nous pouvons commencer à utiliser notre XML en PHP.
Accéder à nos données SimpleXML
Le moyen le plus simple d'accéder aux données dans notre objet SimpleXMLElement consiste à appeler directement les propriétés . Si nous voulons accéder à notre premier bookName, StackOverflow SimpleXML Example
, nous pouvons y accéder comme ci-dessous.
echo $xmlElement->book->bookName;
À ce stade, SimpleXML supposera que parce que nous ne lui avons pas dit explicitement quel livre nous voulons, nous voulons le premier. Cependant, si nous décidons de ne pas vouloir le premier, mais plutôt un Another SimpleXML Example
, nous pouvons y accéder comme ci-dessous.
echo $xmlElement->book[1]->bookName;
Il convient de noter que l'utilisation de [0]
fonctionne de la même façon que de ne pas l'utiliser, donc
$xmlElement->book
fonctionne de la même manière que
$xmlElement->book[0]
En boucle dans notre XML
Il existe de nombreuses raisons pour lesquelles vous souhaiterez peut-être parcourir XML , par exemple si vous souhaitez afficher un certain nombre d'éléments, des livres dans notre cas, sur une page Web. Pour cela, nous pouvons utiliser une boucle foreach ou une boucle standard, en tirant parti de la fonction count de SimpleXMLElement. .
foreach ( $xmlElement->book as $thisBook ) {
echo $thisBook->bookName
}
ou
$count = $xmlElement->count();
for ( $i=0; $i<$count; $i++ ) {
echo $xmlElement->book[$i]->bookName;
}
Gestion des erreurs
Maintenant, nous sommes venus si loin, il est important de réaliser que nous ne sommes que des humains, et que nous finirons probablement par rencontrer une erreur - en particulier si nous jouons constamment avec différents fichiers XML. Et donc, nous voudrons gérer ces erreurs.
Considérons que nous avons créé un fichier XML. Vous remarquerez que bien que ce XML soit très semblable à ce que nous avions précédemment, le problème avec ce fichier XML est que la balise de fermeture finale est / doc au lieu de / 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>
Maintenant, disons, nous chargeons ceci dans notre PHP en tant que fichier $.
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';
}
Nous serons accueillis avec le suivant
FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc
Line: 13
Column: 10
File: filepath/filename.xml
Cependant, dès que nous résolvons ce problème, nous sommes présentés avec "Happy Days".