xpath的使用

来源:互联网 发布:易语言vip解析源码 编辑:程序博客网 时间:2024/05/17 02:35

使用xpath有什么好处?

可以跨层取节点么?

classes.xml文件

<?xml version="1.0" encoding="UTF-8"?><班级><学生><名字>周星驰</名字><年龄>23</年龄><介绍>学习刻苦</介绍></学生><学生><名字>乔峰</名字><年龄>34</年龄><介绍>武功高强</介绍><介绍1>武功高强</介绍1></学生><学生><名字>乔峰</名字><年龄>34</年龄><介绍>武功高强</介绍></学生></班级>
<?php//1,创建DOMDocument对象,代表一个xml文档//Represents an entire HTML or XML document; //serves as the root of the document tree. $xmldoc=new DOMDocument();//2,加载xml(指定你要对哪个xml文档解析)$xmldoc->load("classes.xml");//3,直接取出名字节点$name_nodes=$xmldoc->getElementsByTagName("学生");echo $name_nodes->length;//输出2,php默认支持跨层取的,但是如果还有其同辈元素是“学生”,就出现问题了,不知道取哪个了/* * 如果classes.xml中,指定了编码encoding是utf-8,则解析xml的该php文件 * 编码格式也要是utf-8 */?>

从案例看出,php的dom技术可以跨层取,但是不能保证层次关系,使用xpath可以更好解决

怎样使用xpath

一、通过new DOMXPath,然后调用query方法[和上面的方式进行比较]

<?php //1,创建DOMDocument对象,代表一个xml文档//Represents an entire HTML or XML document; //serves as the root of the document tree. $xmldoc=new DOMDocument();//2,加载xml(指定你要对哪个xml文档解析)$xmldoc->load("classes.xml");//3,Creates a new DOMXPath object. //public DOMXPath::__construct ( DOMDocument $doc )$domXPath=new DOMXPath($xmldoc);//4,使用xpath技术来查询你希望的节点$node_list=$domXPath->query("//学生");//echo $node_list->length;for ($i=0;$i<$node_list->length;$i++){$node=$node_list->item($i);echo $node->tagName."<br/>";}?>

二,通过simplexml_load_file,然后通过SimpleXMLElement类的对象调用xpath方法

<?php//1,simplexml_load_file — Interprets an XML file into an object //Returns an object of class SimpleXMLElement //with properties containing the data held within the XML document$SimpleXMLElement=simplexml_load_file("demo01.xml");$arr=$SimpleXMLElement->xpath("//student");//SimpleXMLElement::xpath — Runs XPath query on XML data//Returns an array of SimpleXMLElement objectsvar_dump($arr);/* * array(2) {  * [0]=> object(SimpleXMLElement)#2 (2) { ["name"]=> string(8) "zhangsan" ["age"]=> string(2) "30" }  * [1]=> object(SimpleXMLElement)#3 (2) { ["name"]=> string(4) "lisi" ["age"]=> string(2) "32" }  * } */foreach ($arr as $val){echo "名字是".$val->name."\n\n"."年龄是"."$val->age"."<br>";}?>

三,先new SimpleXMLElement,然后通过SimpleXMLElement类的对象调用xpath方法【其实和上面的两种,本质上是一样的】

xpath(xml path language)是一种标示节点位置的语言,可以用来描述xml元素的位置。

xpath指令可以指出xml元素在xml文件中的位置,也就是树状结构的节点位置

xpath语言的设计核心思想:可以通过xpath迅捷的定位到你希望查找的节点

xpath学习手册 不错

1)实例 1
基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径

树视图

实例 

/AAA选择根元素AAA
     <AAA>
          <BBB/>
          <CCC/>
          <BBB/>
          <BBB/>
          <DDD>
               <BBB/>
          </DDD>
          <CCC/>
     </AAA>

 

树视图

实例/AAA/CCC选择AAA的所有CCC子元素
     <AAA>
          <BBB/>
          <CCC/>
          <BBB/>
          <BBB/>
          <DDD>
               <BBB/>
          </DDD>
          <CCC/>
     </AAA>
实例 2
如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)

树视图

实例//BBB选择所有BBB元素
     <AAA>
          <BBB/>
          <CCC/>
          <BBB/>
          <DDD>
               <BBB/>
          </DDD>
          <CCC>
               <DDD>
                    <BBB/>
                    <BBB/>
               </DDD>
          </CCC>
     </AAA

树视图

实例//DDD/BBB选择所有父元素是DDD的BBB元素
     <AAA>
          <BBB/>
          <CCC/>
          <BBB/>
          <DDD>
               <BBB/>
          </DDD>
          <CCC>
               <DDD>
                    <BBB/>
                    <BBB/>

               </DDD>
          </CCC>
     </AAA>
实例 3
星号 * 表示选择所有由星号之前的路径所定位的元素

树视图

实例/AAA/CCC/DDD/*选择所有路径依附于/AAA/CCC/DDD的元素

树视图

实例/*/*/*/BBB选择所有的有3个祖先元素的BBB元素

树视图

实例//*选择所有元素
实例 4
方块号里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置, 而last()函数则表示选择集中的最后一个元素.

树视图

实例/AAA/BBB[1]选择AAA的第一个BBB子元素

树视图

实例/AAA/BBB[last()]选择AAA的最后一个BBB子元素
实例 5
属性通过前缀 @ 来指定

树视图

实例//@id选择所有的id属性
     <AAA>
          <BBB id = "b1"/>
          <BBB id = "b2"/>
          <BBB name = "bbb"/>
          <BBB/>
     </AAA>

树视图

实例//BBB[@id]选择有id属性的BBB元素
     <AAA>
          <BBB id = "b1"/>
          <BBBid = "b2"/>
          <BBB name = "bbb"/>
          <BBB/>
     </AAA>

树视图

实例//BBB[@*]选择有任意属性的BBB元素
     <AAA>
          <BBB id = "b1"/>
          <BBB id = "b2"/>
          <BBB name = "bbb"/>
          <BBB/>
     </AAA>

树视图

实例//BBB[not(@*)]选择没有属性的BBB元素
     <AAA>
          <BBB id = "b1"/>
          <BBB id = "b2"/>
          <BBB name = "bbb"/>
          <BBB/>
     </AAA>