Maison  >  Article  >  développement back-end  >  Utilisez la commande xmllint pour traiter XML

Utilisez la commande xmllint pour traiter XML

PHPz
PHPzoriginal
2017-04-02 11:10:564424parcourir

Exemple

curl http://www.php.cn /ip/?q=8.8.8.8 2>/dev/null | xmllint --html --xpath " //ul[@id='csstb']" - 2>/dev/null | sed -e 's/549a3fd9a3c62568d8b32cd8627105c3]*>//g'
Dans l'exemple ci-dessus, il s'agit principalement via Après avoir interrogé la propriété de l'adresse IP sur 123cha, seul le contenu de la partie texte est obtenu en extrayant le résultat (ul#csstb). Les résultats après l'exécution de l'instruction de script ci-dessus sont les suivants :


[Votre requête] :8.8.8.8
Données principales de ce site :
États-Unis
Données secondaires de ce site : Fournisseur DNS public Google : hypo
États-Unis Fournisseur DNS public Google gratuit Google : zwstar Données de référence 1 : États-Unis
Données de référence 2 : États-Unis
Jetons un coup d'œil à l'utilisation d'autres paramètres principaux avec des exemples.

1. --format

Ce paramètre est utilisé pour formater le XML afin de le rendre lisible.
Supposons qu'il existe un fichier XML (person.xml) avec le contenu suivant :


0833d296851a1e081f2175a4cbfa71358a11bc632ea32a57b3e3693c7987c420balldf406f776eecbaf16b62325323196f14ff4fd28be6111b38109cb452b13c2daa30bcfbf0f15553394c7c6f337b58908853 maled575e2c07f4556bb151a80c4adfa44ffcb884f44f2f1937276917c04c3676183
Après avoir effectué les opérations suivantes, la sortie sera dans un format XML plus lisible :

#xmllint --format person.xml
    <?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person>

2. est l'opposé de --format, parfois Afin d'économiser le volume de transmission, nous souhaitons supprimer les blancs dans XML. Dans ce cas, nous pouvons utiliser la commande --noblanks.

Supposons que le contenu de XML (person.xml) soit le suivant


Après avoir exécuté cette opération de paramètre, le résultat de sortie est :
<?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person>


3 . --schema
#xmllint --noblanks person.xml
    <?xml version="1.0"?>
    <person><name>ball</name><age>30</age><sex>male</sex></person>


Utilisez un schéma pour vérifier l'exactitude du fichier XML (le schéma XML est un remplacement basé sur XML pour

DTD

) Supposons qu'il existe un fichier XML. (person.xml) et un fichier de schéma (person .xsd), le contenu est le suivant :

person.xml valide

Remarque : Par défaut, le contenu du fichier vérifié sera affiché après vérification. Vous pouvez utiliser l'option --noout pour supprimer cette sortie, afin que nous puissions obtenir uniquement les résultats de la vérification finale.
<?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person>


#xmllint --noout --schema person.xsd person.xml
<?xml version="1.0"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="name" type="xs:string"/>
      <xs:element name="age" type="xs:integer"/>
      <xs:element name="sex">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="male"/>
            <xs:enumeration value="female"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="person">
        <xs:complexType>
          <xs:all>
            <xs:element ref="name"/>
            <xs:element ref="age"/>
            <xs:element ref="sex"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:schema>
person.xml valide

Maintenant, nous modifions person.xml pour que le champ d'âge de ce fichier et le sexe ne répond pas à la définition de xsd.

#xmllint --schema person.xsd person.xml
    <?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person>
Vous pouvez voir que xmllint a signalé l'erreur avec succès !



4. À propos de la sortie de --schema

Avant de parler de la sortie, examinons le scénario suivant si vous souhaitez exécuter xmllint via php et obtenir le résultat de retour. , votre code est généralement Il devrait ressembler à ceci valid.php


Nous gardons l'erreur dans person.xml ci-dessus.

Exécutez ce code, vous constaterez que le résultat que vous obtenez n'est pas une erreur, mais un
#xmllint --noout --schema person.xsd person.xml
person.xml:4: element age: Schemas validity error : Element &#39;age&#39;: &#39;not age&#39; is not a valid value of the atomic type &#39;xs:integer&#39;.
person.xml:5: element sex: Schemas validity error : Element &#39;sex&#39;: [facet &#39;enumeration&#39;] The value &#39;test&#39; is not an element of the set {&#39;male&#39;, &#39;female&#39;}.
person.xml:5: element sex: Schemas validity error : Element &#39;sex&#39;: &#39;test&#39; is not a valid value of the local atomic type.
person.xml fails to validate
array

(0) {}, incroyable !
Pourquoi cela se produit-il ?

En raison de xmllint --schema, si une erreur se produit lors de la vérification, le message d'erreur n'est pas affiché via la sortie standard (stdout), mais via l'erreur standard (stderr).

Le paramètre de sortie de exec ne peut obtenir que le contenu affiché par la sortie standard (stdout).

Donc, pour obtenir le message d'erreur, nous devons rediriger l'erreur standard vers la sortie standard et modifier le code en conséquence :
<?php
    $command = "xmllint --noout --schema person.xsd person.xml";
    exec($command, $output, $retval);
    //出错时返回值不为0
    if ($retval != 0){
            var_dump($output);
    }
    else{
        echo "yeah!";
    }


$command = "xmllint --noout --schema person.xsd person .xml 2>$1"; Exécutez à nouveau valid.php et obtenez le message d'erreur avec succès !
Exemple

Créez d'abord un document XML, nommé po.xml, avec le contenu suivant :



ee8c11313070fdbf42a8eb4b3e605a5a Puis écrivez po.xml Le schéma Le fichier est nommé po.xsd et a le contenu suivant :



207a5cd0530fd3904973dfab79171a7f Utilisez xmllint pour vérifier le fichier po.xml :

$ xmllint -schema po.xsd po.xml S'il n'y a pas de message d'erreur, cela signifie que la vérification a réussi.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn