Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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_Xpath - Fatal编程技术网

Java XPath求值返回类型

Java XPath求值返回类型,java,xml,xpath,Java,Xml,Xpath,有没有办法确定XPath计算的返回类型?我希望XPath尽可能通用地匹配。它应该匹配一个节点列表,如果不能,则匹配一个节点,如果不能,则匹配一个值。有没有一种简单的方法可以在Java中实现这一点?您应该知道求值的返回类型,因为您将它提供给了求值。例如: XPath xpath = XPathFactory.newInstance().newXPath(); XPathExpression expr = xpath.compile("/expression"); NodeList nodes =

有没有办法确定XPath计算的返回类型?我希望XPath尽可能通用地匹配。它应该匹配一个节点列表,如果不能,则匹配一个节点,如果不能,则匹配一个值。有没有一种简单的方法可以在Java中实现这一点?

您应该知道求值的返回类型,因为您将它提供给了
求值
。例如:

XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("/expression");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

如果您处理的评估结果不是您自己执行的(即,您刚刚收到一些
对象
),那么请使用正常的
实例进行检查。

JAXP XPath API的设计有很多困难,这就是其中之一。考虑使用SAXON作为XPath处理器,它将(a)使您能够使用XPath 2,并且(b)给您更丰富的S9API API的好处。[无耻的插件]

使用标准JAXP实现无法做到这一点,但可以使用。它有一个
selectNodes()
函数,返回对象的
列表。该列表将包含
属性
内容
或文本(可能还有我尚未遇到的其他内容)。您需要向其传递一个JDom文档

org.jdom.Document doc = builder.build(file);
org.jdom.xpath.XPath xp = XPath.newInstance("expression here");
List nodes = xpath.selectNodes(document);
for (Object node : nodes) {
   if (node instanceof Attribute) {
     value = ((Attribute) node).getValue();
   } else if (node instanceof Content) {
     value = ((Content) node).getValue();
   } else if (node instanceof Text) {
     value = (Text) node.getText();
   }
}

我希望找到一种方法来调用它,而不知道返回类型并获得最广泛的结果。