Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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 XPath编译行为_Java_Xml_Exception_Xpath_Transformer - Fatal编程技术网

Java XPath编译行为

Java XPath编译行为,java,xml,exception,xpath,transformer,Java,Xml,Exception,Xpath,Transformer,我正在测试我的应用程序,并意识到编译时的行为是不同的 例如,如果要编译的表达式为: XPathExpression expr = xPath.compile("/DocDetails/TransactionSignature"); 以及: x被声明为字符串数据类型 假设expr2中的x是“abc”,XPathExpression编译时没有任何问题 但如果expr2中的x是“123abc”或“123”,则XPathExpression会抛出: javax.xml.transform.Transf

我正在测试我的应用程序,并意识到编译时的行为是不同的

例如,如果要编译的表达式为:

XPathExpression expr = xPath.compile("/DocDetails/TransactionSignature");
以及:

x被声明为字符串数据类型

假设expr2中的x是“abc”,XPathExpression编译时没有任何问题

但如果expr2中的x是“123abc”或“123”,则XPathExpression会抛出:

javax.xml.transform.TransformerException:需要一个位置步骤 在“/”或“/”标记后面

只是对这种行为感到好奇

以下是完整的代码供参考:

        String document = "C:/Users/Eunice/Documents/MITS/doc.xml";
        String document2 = "C:/Users/Eunice/Documents/MITS/doc2.xml";

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(document);

        Document doc2 = builder.parse(document2);

        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();
        XPathExpression expr = xPath.compile("/DocDetails/TransactionSignature");
        Node node = (Node)expr.evaluate(doc, XPathConstants.NODE);

        String x = node.getTextContent();

        System.out.println(x);

        XPathExpression expr2 = xPath.compile("/DocDetails/" + x);
        Node node2 = (Node)expr2.evaluate(doc2, XPathConstants.NODE);

        if (node2 == null)
            System.out.println("null");
        else 
            System.out.println("not null " + node2.getTextContent());
这是XML文件:

<DocDetails>
    <TransactionSignature>abc123</TransactionSignature>
</DocDetails>

abc123
但如果expr2中的x是“123abc”或“123”,则XPathExpression会抛出

XML元素名称不能以数字开头。因此,您的示例相当于

XPathExpression expr2 = xPath.compile("/DocDetails/123abc");
我猜XPath解析器并没有预料到这一点

您还应该提供完整的XML。我相信它肯定不包含类似
abc123之类的内容。这完全是无效的XML

但如果expr2中的x是“123abc”或“123”,则XPathExpression会抛出

XML元素名称不能以数字开头。因此,您的示例相当于

XPathExpression expr2 = xPath.compile("/DocDetails/123abc");
我猜XPath解析器并没有预料到这一点


您还应该提供完整的XML。我相信它肯定不包含类似
abc123之类的内容。这完全是无效的XML。

经过多次搜索,我终于找到了答案

以数字开始元素标记实际上是非法的

从中可以看出

最初,此行引发了一个transformer异常:

        XPathExpression expr2 = xPath.compile("/DocDetails/" + x); 
因为以数字开头是非法的,所以他们可能把它当作无效的标记来读

这意味着此行实际读取的是“/DocDetails/”而不是“/DocDetails/123”或“/DocDetails/123abc”


导致末尾出现额外的“/”,因此引发transformer异常

经过多次搜索,我终于找到了答案

以数字开始元素标记实际上是非法的

从中可以看出

最初,此行引发了一个transformer异常:

        XPathExpression expr2 = xPath.compile("/DocDetails/" + x); 
因为以数字开头是非法的,所以他们可能把它当作无效的标记来读

这意味着此行实际读取的是“/DocDetails/”而不是“/DocDetails/123”或“/DocDetails/123abc”


导致末尾出现额外的“/”,因此引发transformer异常

谢谢你的输入托马斯为你的答案!另外,我刚刚分享了虚拟XML的一部分,并且知道它在逻辑上可能是错误的/无效的。感谢您的输入,Tomas为您提供了答案!此外,我刚刚共享了伪XML的一部分,并且知道它在逻辑上可能是错误的/无效的。