• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

XPath快速解析XML

mysql 搞代码 4年前 (2022-01-09) 30次浏览 已收录 0个评论

为什么要使用XPATH,上一篇博客查询越靠近下面单词,时间会越长,超过2s就不太好了,XPAth就是用来提高解析XML速度的。还可以解析html,效率也是不错的! 分别查询下列信息 代码: vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ==”brush:sql;”>?php// 详细学习可以参考w3

为什么要使用XPATH,上一篇博客查询越靠近下面单词,时间会越长,超过2s就不太好了,XPAth就是用来提高解析XML速度的。还可以解析html,效率也是不错的!

分别查询下列信息

代码:vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ==”brush:sql;”><?php// 详细学习可以参考w3cschool 构造一个XPATH查询器$xml = new DOMDocument('1.0','utf-8');$xml->load('book.xml');$xpath = new DOMXPATH($xml);/*$sql = 'xxx'; // 路径表达式$xpath->query($sql);*//*xpath的路径表达式如何写?xpath是从根节点到某个节点声经过的路径*/// 查询book.xml下面的每本书的title// /bookstore/book/title/*$sql = '/bookstore/book/title';$

本文来源gaodai.ma#com搞##代!^码7网

rs = $xpath->query($sql);print_r($rs);echo $rs->item(1)->nodeValue;*/// 查询book.xml下面book节点的下面的第2个title节点,哪来的第2个title节点? 这样写是不对的/*$sql = '/bookstore/book/title[2]';$rs = $xpath->query($sql);print_r($rs->length);*/// 查询bookestore下面的第2本书下面的title节点./*$sql = '/bookstore/book[2]/title';$rs = $xpath->query($sql);print_r($rs->item(0)->nodeValue);*/// 查询bookstore下面的book节点并且价格>40元/*$sql = '/bookstore/book[price>40]/title';$rs = $xpath->query($sql);echo $rs->item(0)->nodeValue;*/// 查询侠客行的价格// /bookstore/下面的book,且title=='侠客行'的书的价格$sql = '/bookstore/book[title=”侠客行”]/price';$rs = $xpath->query($sql);echo $rs->item(0)->nodeValue;
xpath如何不考虑路径的层次,来查询某个节点

比如我们刚才严格层次查询 /bookstore/book/title
现在我们加了一个,

<?php$xml = new DOMDocument('1.0','utf-8');$xml->load('book.xml');$xpath = new DOMXPATH($xml);$sql = '/bookstore/book[last()]/title';$rs = $xpath->query($sql);// 只能查到书名的title//echo $rs->item(0)->nodeValue; // 思考 ,如何查询所有的title,不考虑层次关系?$sql = '/title'; // 这样不行,这样查的是根节点下的title,而根节点下没有title/*/a/b,这说明,a,b就是父子关系,而如果用/a//b,这样说明a只是b的祖先就行,忽略了层次*/// 不分层次,查出所有的title/*$sql = '//title';foreach($xpath->query($sql) as $v) {    echo $v->nodeValue,'<br />';}*//*$sql = '//title[2]'; // 这样又理解成<title>a</title><title>b</title>,查询所有相邻的title节点,且第2个foreach($xpath->query($sql) as $v) {    echo $v->nodeValue,'<br />';}*/

上面是简单应用,来改善上篇博客效率问题

<?php// 接收单词并解析XML查询相应的单词$word = isset($_GET['word'])?trim($_GET['word']):'';if(empty($word)) {    exit('你想查啥?');}// 解析XML并查询$xml = new DOMDocument('1.0','utf-8');$xml->load('./dict.xml');/*$namelist = $xml->getElementsByTagName('name');$isfind = false;foreach($namelist as $v) {    if($v->nodeValue == $word) {        //print_r($v);        echo $word,'<br />';        echo '意思:',$v->nextSibling->nodeValue,'<br />';        echo '例句:',$v->nextSibling->nextSibling->nodeValue,'<br />';        $isfind = true;        break;    }}if(!$isfind) {    echo 'sorry';}*/// 接下来用xpath来查询词典$xpath = new DOMXpath($xml);// 查询/dict下的word,且name=$word的节点下面的/name节点$sql = '/dict/word[name="' . $word . '"]/name'; //echo $sql;$words = $xpath->query($sql);if($words->length == 0) {    echo 'sorry';    exit;}// 查到了$name = $words->item(0);echo $word,'<br />';echo '意思:',$name->nextSibling->nodeValue,'<br />';echo '例句:',$name->nextSibling->nextSibling->nodeValue,'<br />';

来解析一下的html

<?php/***====笔记部分====xpath是根据DOM标准来查询,html也是DOM,也能查,岂只是xml***/$html = new DOMDocument('1.0','utf-8');$html->loadhtmlfile('dict.html');$xpath = new DOMXPATH($html);$sql = '/html/body/h2';echo $xpath->query($sql)->item(0)->nodeValue,'<br />';// 查询id="abc"的div节点$sql = '//div[@id="abc"]';echo $xpath->query($sql)->item(0)->nodeValue;// 分析第2个/div/下的p下的相邻span的第2个span的内容$sql = '//div/p/span[2]';echo $xpath->query($sql)->item(0)->nodeValue;

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:XPath快速解析XML

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址