使用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> |
树视图
/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()函数则表示选择集中的最后一个元素.
方块号里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置, 而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> |