基于子值的XPath选择

Jon*_*zer 8 xml xpath

这是一些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>
Run Code Online (Sandbox Code Playgroud)

如何定义一个xpath,以便拉出所有浪漫书籍?或者也许所有的浪漫和政治书籍?

kjh*_*hes 10

所有浪漫类型的书籍:

//book[genres/genre = 'Romance']
Run Code Online (Sandbox Code Playgroud)

所有浪漫政治类型的书籍:

//book[genres/genre = 'Romance' and genres/genre = 'Politics']
Run Code Online (Sandbox Code Playgroud)

浪漫的所有书籍也属于政治类型(与and上面相同):

//book[genres/genre = 'Romance'][genres/genre = 'Politics']
Run Code Online (Sandbox Code Playgroud)

所有浪漫政治类型的书籍:

//book[genres/genre = 'Romance' or genres/genre = 'Politics']
Run Code Online (Sandbox Code Playgroud)

浪漫政治类型的所有书籍 (仅限XPath 2.0):

//book[genres/genre = ('Romance', 'Politics')]
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. //bookbook在根元素下找到所有元素; /books/book查找根元素的所有bookbooks元素.对于给定的XML,它们选择相同的元素.
  2. 您可以附加/author到上述任何XPath中以选择 author指定条件的书籍元素.

无法使其工作?

首先,确定一个基本的XPath工作: //book应该返回两个元素.

如果不是:

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

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

  1. //book[genres]应该选择book具有任何子genres 元素的元素.
  2. //book[genres/genre]应该选择book具有任何子 genres元素的元素,只有它依次具有genre子元素.

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


Rub*_*ias 9

你可以去//book[./genres/genre = 'Romance']//book[./genres/genre = 'Romance' and ./genres/genre = 'Politics']分别,

  • @jglazer您的实际XML文档看起来与您上面显示的文档完全相同,或者您是否省略了某些内容或简化了它?Rubens,谓词中的`./`不是必需的,`child ::`被隐含地假定为上下文. (2认同)
  • @jglazer:这个答案是正确的(+1),只是比必要的更冗长(如Mathias所提到的).我已经在我的回答中添加了一些[**XPath故障排除步骤**](http://stackoverflow.com/a/41030788/290085) - 希望这些会有所帮助. (2认同)