带有Java集合参数的XpathExpression

时间:2013-03-20 12:30:52

标签: java xpath

在java {“0”,“1”,“true”,“false”}中有这样的集合我想选择所有属于'available'属于我的集合的书。

XML文件的例子:

<?xml version="1.0" encoding="UTF-8"?>
<books:booklist
    xmlns:books="http://univNaSpResolver/booklist"
    xmlns="http://univNaSpResolver/book"
    xmlns:fiction="http://univNaSpResolver/fictionbook">
    <science:book xmlns:science="http://univNaSpResolver/sciencebook">
        <title>Learning XPath</title>
        <author>Michael Schmidt</author>
        <available>1</available>
    </science:book>
    <fiction:book>
        <title>Faust I</title>
        <author>Johann Wolfgang von Goethe</author>
        <available>maybe</available>
    </fiction:book>
    <fiction:book>
        <title>Faust II</title>
        <author>Johann Wolfgang von Goethe</author>
        <available>true</available>
    </fiction:book>
</books:booklist>

似乎使用contains函数可以做到这一点,但我不知道如何在XPath中使用列表作为参数(对于java)。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我无法帮助您使用具体的Java代码,但要检查一个元素是否包含XPath 1.0中的列表或值集合之一,您通常会从列表或集合中创建一个字符串,其中的值不包含在值中例如您的收藏集{"0","1","true","false"}变为|0|1|true|false|(我在其中选择了条形字符|作为分隔符)然后您进行比较,例如//book[contains($list, concat('|', available, '|'))]

显然你的输入更复杂,因为它使用命名空间,并且那种方式(至少?)你正在寻找两个不同的元素,而available元素也在命名空间中。

因此假设xmlns:science="http://univNaSpResolver/sciencebook"xmlns:fiction="http://univNaSpResolver/fictionbook"xmlns:book="http://univNaSpResolver/book"的命名空间映射可能看起来像

//science:book[contains('|0|1|true|false|', concat('|', book:available, '|'))] |
//fiction:book[contains('|0|1|true|false|', concat('|', book:available, '|'))]

当然建议将值字符串作为参数传入,这样就可以得到这样的结果。

//science:book[contains($list, concat('|', book:available, '|'))] |
//fiction:book[contains($list, concat('|', book:available, '|'))]

答案 1 :(得分:0)

XPath中可用的contains(string1,string2)函数仅仅是

的字符串比较
  

如果string1包含string2,则返回true,否则返回false

您始终可以使用OR运算符加入谓词:

//science:book[available="true" or available="false" or available="1" or available="0"] |
//fiction:book[available="true" or available="false" or available="1" or available="0"]