使用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 objects var_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> |
//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> |
/AAA/CCC/DDD/* |
---|
选择所有路径依附于/AAA/CCC/DDD的元素 |
/AAA/BBB[1] |
---|
选择AAA的第一个BBB子元素 |
//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> |