基于子节点值的XPath选择

11

这里有一些 XML:

<books>
    <book>
        <author>Tom</author>
        <genres>
            <genre>Science</genre>
            <genre>Romance</genre>
        </genres>
    </book>
    <book>
        <author>Mike</author>
        <genres>
            <genre>Politics</genre>
            <genre>Romance</genre>
        </genres>
    </book>
</books>

如何定义一个xpath,以便提取所有浪漫小说?或者所有的浪漫和政治书籍?

2个回答

13

分别可以使用//book[./genres/genre = 'Romance']//book[./genres/genre = 'Romance' and ./genres/genre = 'Politics']


我确实尝试了这个,但它没有返回结果。我可能在某个地方漏掉了什么。我会再试一下。 - Jon Glazer
2
@jglazer,您的实际XML文档是否与上面显示的完全相同,或者您可能省略了某些内容或简化了它?Rubens,在谓词中的“./”是不必要的,因为“child::”被隐含地假定为上下文。 - Mathias Müller
2
@jglazer:这个答案是正确的(+1),只是略微冗长了一些(正如Mathias所提到的)。我在我的答案中添加了一些XPath故障排除步骤--希望这些能有所帮助。 - kjhughes
谢谢kjhughes等人...我下周才能开始使用它,但我会更加努力。 - Jon Glazer

10

浪漫类别的所有书籍:

//book[genres/genre = 'Romance']

浪漫与政治类别的所有书籍:

//book[genres/genre = 'Romance' and genres/genre = 'Politics']

浪漫类别中同时也属于政治流派的所有书籍(与上面的and相同):

//book[genres/genre = 'Romance'][genres/genre = 'Politics']

浪漫或政治类别的所有书籍:

//book[genres/genre = 'Romance' or genres/genre = 'Politics']

浪漫类别政治类别的所有图书(仅适用于XPath 2.0):

//book[genres/genre = ('Romance', 'Politics')]

注意:

  1. //book 查找根元素下的所有book元素; /books/book 查找books根元素下的所有book子元素。对于给定的XML,它们选择相同的元素。
  2. 您可以在任何上述XPath后附加/author以选择指定标准的书籍的author元素。

无法使其工作?

首先,确认基本的XPath是否有效://book应返回两个元素。

如果没有:

  1. 仔细检查XPath表达式和XML的拼写。
  2. 检查大小写。 XML和XPath区分大小写。
  3. 检查是否存在命名空间。 命名空间实际上是元素和属性名称的一部分,并且必须加以考虑。请参见XPath如何处理XML命名空间?

然后,从那里逐步添加XPath步骤:

  1. //book[genres] 应选择具有任何genres子元素的book元素。

  2. //book[genres/genre] 应选择具有任何genres子元素的 book元素,仅当它反过来具有genre子元素时。

  3. //book[genres/genre ='Romance'] 应选择浪漫题材所有书籍,如所请求的那样。请注意,必须引用 'Romance' ;否则,表达式将针对bookRomance 子元素的字符串值进行测试,并且肯定会失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接