>백엔드 개발 >XML/RSS 튜토리얼 >xmllint 명령을 사용하여 xml 처리

xmllint 명령을 사용하여 xml 처리

PHPz
PHPz원래의
2017-04-02 11:10:564442검색

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'
위의 예에서는 다음과 같습니다. 주로 123cha에서 IP 주소의 소유권을 질의한 후, 그 결과(ul#csstb)를 추출하여 텍스트 부분의 내용만을 얻는다. 위 스크립트 문을 실행한 후의 결과는 다음과 같습니다.


[Your query]:8.8.8.8
이 사이트의 주요 데이터:
United States
이의 2차 데이터 사이트: Google Public DNS 제공자: hypo
미국 Google 무료 Google Public DNS 제공자: zwstar 참고 데이터 1: 미국
참고 데이터 2: 미국
다른 주요 매개변수의 사용법을 살펴보겠습니다. 예를 들어.

1. --format

이 매개변수는 xml을 읽을 수 있도록 형식을 지정하는 데 사용됩니다.
다음 내용을 포함하는 xml(person.xml)이 있다고 가정합니다.


0833d296851a1e081f2175a4cbfa71358a11bc632ea32a57b3e3693c7987c420balldf406f776eecbaf16b62325323196f14ff4fd28be6111b38109cb452b13c2daa30bcfbf0f15553394c7c6f337b58908853 maled575e2c07f4556bb151a80c4adfa44ffcb884f44f2f1937276917c04c3676183
다음 작업을 수행하면 더 읽기 쉬운 xml 형식으로 출력됩니다.

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

2. --noblanks

--format의 반대, 때로는 전송량을 저장하기 위해 xml에서 공백을 제거하려는 경우 --noblanks 명령을 사용할 수 있습니다.
xml(person.xml)의 내용이 다음과 같다고 가정합니다.

<?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person>

이 매개변수 작업을 실행한 후 출력 결과는 다음과 같습니다.

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

3, --schema

scheam을 사용하여 xml 파일의 정확성을 확인합니다(XML 스키마는 DTD를 XML 기반으로 대체합니다). 및 scheam 파일(person.xsd) 파일의 내용은 다음과 같습니다.

person.xml

<?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person>

person.xsd


<?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>

실행 후 결과 다음 명령은 다음과 같습니다.


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

Person.xml이 유효성을 검사합니다.

참고: 기본적으로 확인된 파일 내용은 확인 후 출력됩니다. --noout 옵션을 사용하여 이 출력을 제거할 수 있습니다. 최종 검증 결과만 얻을 수 있다는 것입니다.

#xmllint --noout --schema person.xsd person.xml
person.xml의 유효성 검사
이제 person.xml을 변경하여 이 파일의 age 필드를 변경합니다. Sex는 xsd의 정의를 충족하지 않습니다.

#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

xmllint가 성공적으로 오류를 보고한 것을 확인할 수 있습니다!


4. --schema 출력에 대해

출력에 대해 이야기하기 전에 php를 통해 xmllint를 실행하고 반환 결과를 얻으려면 다음 시나리오를 살펴보겠습니다. , 귀하의 코드는 일반적으로 다음과 같습니다 valid.php

<?php
    $command = "xmllint --noout --schema person.xsd person.xml";
    exec($command, $output, $retval);
    //出错时返回值不为0
    if ($retval != 0){
            var_dump($output);
    }
    else{
        echo "yeah!";
    }

위의 person.xml에 오류를 유지합니다.

이 코드를 실행하면 결과가 오류가 아니라
배열(0) {}이라는 것을 알 수 있습니다. 놀랍습니다! 왜 이런 일이 일어나는 걸까요?

xmllint --schema 때문에 검증 중 오류가 발생하면 표준 출력(stdout)이 아닌 표준 오류(stderr)를 통해 오류 메시지가 표시됩니다.

exec의 출력 매개변수는 표준 출력(stdout)에 표시된 내용만 가져올 수 있습니다.
따라서 오류 메시지를 얻으려면 표준 오류를 표준 출력으로 리디렉션하고 이에 따라 코드를 수정해야 합니다.

$command = "xmllint --noout --schema person.xsd person .xml 2>$1";
valid.php를 다시 실행하면 오류 메시지가 성공적으로 나옵니다!

먼저 다음 내용으로 po.xml이라는 xml 문서를 만듭니다.

<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
    <shipTo country="US">
        <name>Alice Smith</name>
        <street>123 Maple Street</street>
        <city>Mill Valley</city>
        <state>CA</state>
        <zip>90952</zip>
    </shipTo>
    <billTo country="US">
        <name>Robert Smith</name>
        <street>8 Oak Avenue</street>
        <city>Old Town</city>
        <state>PA</state>
        <zip>95819</zip>
    </billTo>
    <comment>Hurry, my lawn is going wild!</comment>
    <items>
        <item partNum="872-AA">
            <productName>Lawnmower</productName>
            <quantity>1</quantity>
            <USPrice>148.95</USPrice>
            <comment>Confirm this is electric</comment>
        </item>
        <item partNum="926-AA">
            <productName>Baby Monitor</productName>
            <quantity>1</quantity>
            <USPrice>39.98</USPrice>
            <shipDate>1999-05-21</shipDate>
        </item>
    </items>

ee8c11313070fdbf42a8eb4b3e605a5a그런 다음 po.xml에 대한 스키마를 작성합니다. 파일 이름은 po.xsd이고 내용은 다음과 같습니다.


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:annotation>
  <xsd:documentation xml:lang="en">
   Purchase order schema for Example.com.
   Copyright 2000 Example.com. All rights reserved.
  </xsd:documentation>
 </xsd:annotation>
 <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
 <xsd:element name="comment" type="xsd:string"/>
 <xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
   <xsd:element name="shipTo" type="USAddress"/>
   <xsd:element name="billTo" type="USAddress"/>
   <xsd:element ref="comment" minOccurs="0"/>
   <xsd:element name="items"  type="Items"/>
  </xsd:sequence>
  <xsd:attribute name="orderDate" type="xsd:date"/>
 </xsd:complexType>
 <xsd:complexType name="USAddress">
  <xsd:sequence>
   <xsd:element name="name"   type="xsd:string"/>
   <xsd:element name="street" type="xsd:string"/>
   <xsd:element name="city"   type="xsd:string"/>
   <xsd:element name="state"  type="xsd:string"/>
   <xsd:element name="zip"    type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="country" type="xsd:NMTOKEN"
     fixed="US"/>www.111cn.net
 </xsd:complexType>
 <xsd:complexType name="Items">
  <xsd:sequence>
   <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element name="productName" type="xsd:string"/>
      <xsd:element name="quantity">
       <xsd:simpleType>
        <xsd:restriction base="xsd:positiveInteger">
         <xsd:maxExclusive value="100"/>
        </xsd:restriction>
       </xsd:simpleType>
      </xsd:element>
      <xsd:element name="USPrice"  type="xsd:decimal"/>
      <xsd:element ref="comment"   minOccurs="0"/>
      <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
     </xsd:sequence>
     <xsd:attribute name="partNum" type="SKU" use="required"/>
    </xsd:complexType>
   </xsd:element>
  </xsd:sequence>
 </xsd:complexType>
 <!-- Stock Keeping Unit, a code for identifying products -->
 <xsd:simpleType name="SKU">
  <xsd:restriction base="xsd:string">
   <xsd:pattern value="d{3}-[A-Z]{2}"/>
  </xsd:restriction>
 </xsd:simpleType>

207a5cd0530fd3904973dfab79171a7f xmllint를 사용하여 po.xml 파일을 확인합니다.


$ xmllint -schema po.xsd po.xml 오류 메시지가 없으면 검증에 통과한 것입니다.

위 내용은 xmllint 명령을 사용하여 xml 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.