PHP Utilisation de XML avec la bibliothèque SimpleXML de PHP


Exemple

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