XPath快速解析XML

php中文网
发布: 2016-06-07 16:10:29
原创
1477人浏览过

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

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

分别查询下列信息

\

代码:喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:sql;">load('book.xml'); $xpath = new DOMXPATH($xml); /* $sql = 'xxx'; // 路径表达式 $xpath->query($sql); */ /* xpath的路径表达式如何写? xpath是从根节点到某个节点声经过的路径 */ // 查询book.xml下面的每本书的title // /bookstore/book/title /* $sql = '/bookstore/book/title'; $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;
登录后复制


最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号