数据库

 首页 > 数据库 > MySql > XPath快速解析XML

XPath快速解析XML

分享到:
【字体:
导读:
         摘要:为什么要使用XPATH,上一篇博客查询越靠近下面单词,时间会越长,超过2s就不太好了,XPAth就是用来提高解析XML速度的。还可以解析html,效率也是不错的!分别查询下列信息代码:load('book ...

XPath快速解析XML

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

分别查询下列信息


代码:

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
现在我们加了一个,

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,'
'; } */ /* $sql = '//title[2]'; // 这样又理解成ab,查询所有相邻的title节点,且第2个 foreach($xpath->query($sql) as $v) { echo $v->nodeValue,'
'; } */

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

load('./dict.xml');


/*
$namelist = $xml->getElementsByTagName('name');

$isfind = false;

foreach($namelist as $v) {
    if($v->nodeValue == $word) {
        //print_r($v);
        echo $word,'
'; echo '意思:',$v->nextSibling->nodeValue,'
'; echo '例句:',$v->nextSibling->nextSibling->nodeValue,'
'; $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,'
'; echo '意思:',$name->nextSibling->nodeValue,'
'; echo '例句:',$name->nextSibling->nextSibling->nodeValue,'
';

来解析一下的html

loadhtmlfile('dict.html');


$xpath = new DOMXPATH($html);
$sql = '/html/body/h2';
echo $xpath->query($sql)->item(0)->nodeValue,'
'; // 查询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;


XPath快速解析XML
分享到:
分布式缓存GemFire架构介绍
分布式缓存GemFire架构介绍 1什么是GemFire GemFire是一个位于应用集群和后端数据源之间的高性能、分布式的操作数据(operational data)管理基础架构。它提供了低延迟、高吞吐量的数据共享和事件分发。GemFire充分利用网络中的内存和磁盘资源,形成一个实时的数据网格(data fabric or grid)。   GemFire的主要特性有: ...
The 16th tip of DB Query Analyzer
The 16th tip of DB Query Analyzer                The 16th tip of DB Query Analyzer      ---- SQL Schedule will be executed even DBMS has ever been down in 6.02                   Ma Genfeng         (Guangdong Unitoll Services incorporated, Guangzhou 510300)   Abstract...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……