好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

xmllint命令处理xml与html的例子 - php高级应用

xmllint命令处理xml与html的例子

xmllint是一个很方便的处理及验证xml、处理html的工具,linux下只要安装libxml2就可以使用这个命令,首先看下其结合--html、--xpath参数处理html时的例子.

例子: curl http://www.phpfensi.com /ip/?q=8.8.8.8 2>/dev/null | xmllint --html --xpath "//ul[@id='csstb']" - 2>/dev/null | sed -e 's/<[^>]*>//g'

上例中主要是通过在123cha上查询的IP地址的归属情况后,通过提取结果(ul#csstb),只获取文本部分的内容,上面的脚本语句执行后的结果如下:

[您的查询]:8.8.8.8  本站主数据:  美国  本站辅数据:Google Public DNS提供:hypo  美国 Google免费的Google Public DNS提供:zwstar参考数据一:美国  参考数据二:美国 

下面再结合示例看下其他主要参数的用法.

1、--format

此参数用于格式化xml,使其具有良好的可读性,假设有xml(person.xml)内容如下:

<person><name>ball</name><age>30</age<sex>male</sex></person>

执行如下操作后其输出为更易读的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 Schema 是基于 XML 的 DTD 替代者),假设有xml文件(person.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 validates   

注:默认情况下,验证后会输出验证的文件内容,可以使用 --noout选项去掉此输出,这样我们可以只得到最后的验证结果.

#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成功的报出了错误.

4、关于--schema的输出

在讲输出之前先看下面一个场景,假如你想通过php执行xmllint然后拿到返回结果,你的代码通常应该是这个样子valid.php,实例代码如下:

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

我们保持上文中person.xml的错误。

执行此代码,你会发现,你拿到的output不是错误,而是array(0) {},amazing!

为什么会这样呢?

因为xmllint --schema,如果验证出错误,错误信息并不是通过标准输出(stdout)显示的,而是通过标准错误(stderr)进行显示的,而exec的output参数拿到的,只能是标准输出(stdout)显示的内容.

所以,为了拿到出错信息,我们需要将标准错误重定向到标准输出,对应修改代码:

$command = "xmllint --noout --schema person.xsd person.xml 2>$1";  

再次执行valid.php,错误信息顺利拿到.

例子: 首先建立一份 xml 文档,命名为 po.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 >   </ purchaseOrder >  

然后为 po.xml 写的 schema 文件,取名为 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" />     </ 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如果无出错信息,就说明校验通过了.

查看更多关于xmllint命令处理xml与html的例子 - php高级应用的详细内容...

  阅读:38次