《PHP編程:PHP使用xmllint命令處理xml與html的方法》要點:
本文介紹了PHP編程:PHP使用xmllint命令處理xml與html的方法,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP應用本文實例講述了PHP使用xmllint命令處理xml與html的辦法.分享給大家供大家參考.具體分析如下:
PHP應用xmllint是一個很方便的處理及驗證xml、處理html的工具,linux下只要安裝libxml2就可以使用這個命令.首先看下其結(jié)合--html 、--xpath參數(shù)處理html時的例子:
PHP應用示例如下:
代碼如下:
curl /ip/?q=8.8.8.8 2>/dev/null | xmllint --html --xpath "http://ul[@id='csstb']" - 2>/dev/null | sed -e 's/<[^>]*>//g'
上例中主要是通過在123cha上查詢的IP地址的歸屬情況后,通過提取結(jié)果(ul#csstb),只獲取文本部分的內(nèi)容.上面的腳本語句執(zhí)行后的結(jié)果如下:
PHP應用[您的查詢]:8.8.8.8
本站主數(shù)據(jù):
美國
本站輔數(shù)據(jù):Google Public DNS提供:hypo
美國 Google免費的Google Public DNS提供:zwstar參考數(shù)據(jù)一:美國
參考數(shù)據(jù)二:美國
PHP應用下面再結(jié)合示例看下其他主要參數(shù)的用法.
1、 --format
此參數(shù)用于格式化xml,使其具有良好的可讀性.
假設有xml(person.xml)內(nèi)容如下:
代碼如下:
<person><name>ball</name><age>30</age<sex>male</sex></person>
執(zhí)行如下操作后其輸出為更易讀的xml格式:
代碼如下:
#xmllint --format person.xml
<?xml version="1.0"?>
??? <person>
????? <name>ball</name>
????? <age>30</age>
????? <sex>male</sex>
??? </person>
2、 --noblanks
與--format相反,有時為了節(jié)省傳輸量,我們希望去掉xml中的空白,這時我們可以使用--noblanks命令.
假設xml(person.xml)內(nèi)容如下
代碼如下:
<?xml version="1.0"?>
??? <person>
????? <name>ball</name>
????? <age>30</age>
????? <sex>male</sex>
??? </person>
執(zhí)行該參數(shù)操作后,其輸出結(jié)果為:
代碼如下:
#xmllint --noblanks person.xml
<?xml version="1.0"?>
??? <person><name>ball</name><age>30</age><sex>male</sex></person>
3、--schema
使用scheam驗證xml文件的正確性(XML Schema 是基于 XML 的 DTD 替代者)
假設有xml文件(person.xml)和scheam文件(person.xsd)文件,內(nèi)容分別如下
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>
按如下命令執(zhí)行后的結(jié)果是:
代碼如下:
#xmllint --schema person.xsd person.xml
<?xml version="1.0"?>
??? <person>
????? <name>ball</name>
????? <age>30</age>
????? <sex>male</sex>
??? </person>
PHP應用person.xml validates?
注:默認情況下,驗證后會輸出驗證的文件內(nèi)容,可以使用 --noout選項去掉此輸出,這樣我們可以只得到最后的驗證結(jié)果.
代碼如下:
#xmllint --noout --schema person.xsd person.xml
person.xml validates?
下面我們改動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 validate
可以看到xmllint成功的報出了錯誤!
PHP應用4、 關于--schema的輸出
PHP應用在講輸出之前先看下面一個場景,假如你想通過php執(zhí)行xmllint然后拿到返回結(jié)果,你的代碼通常應該是這個樣子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的錯誤.
PHP應用執(zhí)行此代碼,你會發(fā)現(xiàn),你拿到的output不是錯誤,而是array(0) {}, amazing!
為什么會這樣呢?
PHP應用因為xmllint --schema,如果驗證出錯誤,錯誤信息并不是通過標準輸出(stdout)顯示的,而是通過標準錯誤(stderr)進行顯示的.
PHP應用而exec的output參數(shù)拿到的,只能是標準輸出(stdout)顯示的內(nèi)容.
所以,為了拿到出錯信息,我們需要將標準錯誤重定向到標準輸出,對應修改代碼:
代碼如下:
$command = "xmllint --noout --schema person.xsd person.xml 2>$1";
再次執(zhí)行valid.php,錯誤信息順利拿到!
PHP應用例子如下:
首先建立一份 xml 文檔,命名為 po.xml,其內(nèi)容如下:
代碼如下:
<?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>
</purchaseOrder>
然后為 po.xml 寫的 schema 文件,取名為 po.xsd,內(nèi)容如下:
代碼如下:
<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.jb51.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>
</xsd:schema>
使用 xmllint 對 po.xml 文件進行校驗:
代碼如下:
$ xmllint?? -schema po.xsd po.xml
如果無出錯信息,就說明校驗通過了.
PHP應用希望本文所述對大家的PHP程序設計有所贊助.
《PHP編程:PHP使用xmllint命令處理xml與html的方法》是否對您有啟發(fā),歡迎查看更多與《PHP編程:PHP使用xmllint命令處理xml與html的方法》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/13397.html