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的一部分,并且知道它在逻辑上可能是错误的/无效的。