Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java VTD-XML和Xpath 2.0转义字符串_Java_Xml_Xpath_Vtd Xml - Fatal编程技术网

Java VTD-XML和Xpath 2.0转义字符串

Java VTD-XML和Xpath 2.0转义字符串,java,xml,xpath,vtd-xml,Java,Xml,Xpath,Vtd Xml,当我尝试使用VTD-XML在Java中运行以下xpath表达式时,我遇到了一个意外错误 代码: .. AutoPilot ap = new AutoPilot(vn); ap.selectXPath("/a//b[text() = 'apple''banana']"); Syntax error after or around the end of ==> /a//b[text() = 'apple' Caused by: com.ximpleware.XPathParseExcepti

当我尝试使用VTD-XML在Java中运行以下xpath表达式时,我遇到了一个意外错误

代码:

..
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/a//b[text() = 'apple''banana']");
Syntax error after or around the end of ==> /a//b[text() = 'apple'
Caused by: com.ximpleware.XPathParseException: XPath Syntax error: #29
    at com.ximpleware.xpath.parser.unrecovered_syntax_error(parser.java:492)
    at java_cup.runtime.lr_parser.parse(lr_parser.java:601)
    at com.ximpleware.AutoPilot.selectXPath(AutoPilot.java:809)
错误:

..
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/a//b[text() = 'apple''banana']");
Syntax error after or around the end of ==> /a//b[text() = 'apple'
Caused by: com.ximpleware.XPathParseException: XPath Syntax error: #29
    at com.ximpleware.xpath.parser.unrecovered_syntax_error(parser.java:492)
    at java_cup.runtime.lr_parser.parse(lr_parser.java:601)
    at com.ximpleware.AutoPilot.selectXPath(AutoPilot.java:809)

这不是虫子吗?我的印象是,在XPath2.0中转义单引号是可以接受的?当我尝试使用同一文档在XMLSpy中运行xpath查询时,它运行得很好。

转义完全由使用xpath查询数据的宿主语言负责。该高级语言的转义规则通常也适用于其中使用的XPath表达式

我引用Michael Kay的XPath 2.0程序员参考:

类似地,当XPath表达式写在字符串中时 在Java等宿主语言中,需要使用转义 该语言的惯例:例如,[…]引号
\”

换句话说,
'
确实转义了一个单引号。在Java中,单引号必须转义为
\'

ap.selectXPath("/a//b[text() = 'apple\'banana']");

不幸的是,转义似乎不是一个选项,我不得不基于以下内容编写一个自定义函数:

它是用javascript编写的,所以我将其转换为Java:

private static String cleanStringForXPath(String dirtyString)
    {
        Pattern pattern = Pattern.compile("([^'\"]+|['\"])");
        Matcher matcher = pattern.matcher(dirtyString);

        int count = 0;
        StringBuilder sb = new StringBuilder();

        while(matcher.find()) {
            String part = matcher.group(1);
            if(part.equals("'")) {
                sb.append("\"'\"");
            } else if(part.equals("\"")) {
                sb.append("'\"'");
            } else { 
                sb.append("'" + part + "'");
            }
            sb.append(",");
            count++;
        }

    String result = sb.length() > 0 ? sb.substring(0, sb.length() - 1): "";
    return (count > 1) ? "concat(" + result + ")" : result;
}

我测试了这个函数,它似乎解决了我的问题。

因为XPath也可以支持
。“
字符串可以包含unscaped'-s,您可以使用:

   ap.selectXPath("/a//b[text() = \"apple'banana\"]");

谢谢,我尝试了这个,但没有成功。我现在得到了acom.ximpleware.XPathParseException:XPath表达式异常中的无效字符。@BigbyWolf是唯一标识元素的单引号吗?如果显示要查询的XML文件,也许我们可以找到另一个返回同一节点的表达式。@BigbyWolf,您确定吗VTD-XML使用XPath 2.0?在sourceforge页面上,我发现:“VTD-XML完全符合W3C XPath 1.0建议。”。这是否过时了?感谢您的帮助。我相信您是正确的,VTD-XML使用的是XPath 1.0(我的错误)。基于此,我尝试了“和&apos”,我相信它应该在XPath 1.0中工作,但运气不好。最后,我编写了一个自定义方法,将字符串拆分并使用Xpath concat函数。我通常建议将参数注入Xpath表达式中,使用Xpath库提供的工具设置变量,然后引用表达式中的变量(
/a//b[.=$targetValue]
)。但是VTD-XML只允许您通过计算另一个XPath表达式来设置变量,这与我所知道的所有其他XPath实现不同,它允许您直接插入Java字符串或数字作为变量的值。我认为双引号前面的反斜杠应该可以解决问题。如果您像这样转义双引号,那么它们很可能被认为是字符串的一部分,并且不划界任何东西。@MathiasMüller:Ofc它们被认为是字符串的一部分。这就是问题所在,字符串成为XPath表达式,但是,这个字符串不再被分隔,这将导致一个错误(或者XPath将决定它是一个元素名)。至少在我看来是这样。如果我遗漏了一些明显的内容,我深表歉意。XPath只会看到最后一个未替换的字符串。Aka
/a//b[text()=“苹果香蕉”]