집 >백엔드 개발 >XML/RSS 튜토리얼 >xmllint 명령을 사용하여 xml 처리
예
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) 파일의 내용은 다음과 같습니다.
<?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 'age': 'not age' is not a valid value of the atomic type 'xs:integer'. person.xml:5: element sex: Schemas validity error : Element 'sex': [facet 'enumeration'] The value 'test' is not an element of the set {'male', 'female'}. person.xml:5: element sex: Schemas validity error : Element 'sex': 'test' is not a valid value of the local atomic type. person.xml fails to validatexmllint가 성공적으로 오류를 보고한 것을 확인할 수 있습니다!
<?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) {}이라는 것을 알 수 있습니다. 놀랍습니다! 왜 이런 일이 일어나는 걸까요?
exec의 출력 매개변수는 표준 출력(stdout)에 표시된 내용만 가져올 수 있습니다.
따라서 오류 메시지를 얻으려면 표준 오류를 표준 출력으로 리디렉션하고 이에 따라 코드를 수정해야 합니다.
$command = "xmllint --noout --schema person.xsd person .xml 2>$1";
valid.php를 다시 실행하면 오류 메시지가 성공적으로 나옵니다!
<?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 명령을 사용하여 xml 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!