xpath的使用

1 篇文章 0 订阅

使用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()函数则表示选择集中的最后一个元素.

树视图

实例
/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>
 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值