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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow