Utilisez la commande xmllint pour traiter XML

PHPz
Libérer: 2017-04-02 11:10:56
original
4422 Les gens l'ont consulté

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/<[^>]*>//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 :


ball30 male
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>
Copier après la connexion

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>
Copier après la connexion
Copier après la connexion


3 . --schema
#xmllint --noblanks person.xml
    <?xml version="1.0"?>
    <person><name>ball</name><age>30</age><sex>male</sex></person>
Copier après la connexion


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>
Copier après la connexion
Copier après la connexion


#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>
Copier après la connexion
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>
Copier après la connexion
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
Copier après la connexion
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!";
    }
Copier après la connexion


$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 :



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



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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!