使用 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");
    
    ?>

它只返回一个空数组。 我只想选择所有 &lt;book&gt; 元素(不包括 &lt;bookstore&gt;&lt;?xml version?&gt; 标头)

在 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的主要内容,如果未能解决你的问题,请参考以下文章

使用XPath选择DOM元素

xpath

lxml结合xpath注意事项

八爪鱼在哪里设置xpath

Scrapy模块

第四部分 解析库的使用(XPathBeautiful SoupPyQuery)