使用 XPath 选择某个 nodeName
Posted
技术标签:
【中文标题】使用 XPath 选择某个 nodeName【英文标题】:Using XPath to select certain nodeName 【发布时间】:2011-04-19 07:36:36 【问题描述】:我按照 W3Schools 上的教程进行操作。
http://www.w3schools.com/xpath/xpath_syntax.asp
上面写着:
nodename 选择所有子节点 命名节点
bookstore 选择所有子节点 的书店元素
这是我的代码
书店.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
php 文件:
<?php
$xml = simplexml_load_file("bookstore.xml");
if(!$xml)
echo 'bad';
else
$res = $xml->xpath("//bookstore");
when I use $res = $xml->xpath("bookstore");
$xml_res1 = $res1->asXML("booklist.xml");
?>
它只返回一个空数组。
我只想选择所有 <book>
元素(不包括 <bookstore>
和 <?xml version?>
标头)
在 W3Schools 示例中,“//bookstore”可以选择书店元素的所有子节点。
谁能告诉我为什么我得到一个空数组?谢谢!
【问题讨论】:
【参考方案1】:使用:
/*/book
甚至
/*/*
当然,你也可以使用:
/bookstore/book
甚至
/child::bookstore/child::book
鉴于提供的 XML 文档,以上所有表达式都准确地选择了想要的节点——文档中的所有 book
元素。
始终尽量避免使用//
缩写,因为这可能会导致评估效率非常低。
【讨论】:
@Dimitre Novatchev:你能看看这个问题吗:***.com/questions/6478324/…? @Fran:我无法理解这个问题的任何内容——即使代码是用什么语言编写的。我不认为它包含任何与 XPath 相关的内容——否则我会回答的。 @Dimitre Novatchev:基本上,他必须排除 html 标签。使用 xpath exp //text() 可以工作,只是不检索空行。 @Fran:这仍然不是 XPath 问题。他必须使用这样的参数调用他的 XML 解析器,以防止它丢弃仅包含空格的文本节点,或者如果他对 XML 文档本身具有修改权限,他可以在顶部元素上放置一个xml:space="preserve"
属性。
@Dimitre Novatchev:他从服务器接收到该 hml:空行用 例如。无论如何,谢谢。
【参考方案2】:该语句应该是:选择所有具有此名称的子节点。
这就是为什么在规范12 中将其称为名称测试。
如果你想要book
元素:
/bookstore/book
【讨论】:
以上是关于使用 XPath 选择某个 nodeName的主要内容,如果未能解决你的问题,请参考以下文章