使用XPATH表达式和Java解析XML文件

我想解析一个xml文件,我正在使用Java和xpath评估。

我想用xpath表达式输出当前的节点兄弟,而不使用getNextSibling()函数,这可能吗?

例如,如果我们读取name元素,我想添加xpath expression =“./ address”,以便在不使用getNextSibling()/的情况下输出“name”的兄弟。

xml文件如下:

  

我的代码如下:

  package dom_stack4; import org.w3c.dom.*; import javax.xml.xpath.*; import javax.xml.parsers.*; import java.io.IOException; import org.xml.sax.SAXException; public class Dom_stack4 { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException { // TODO code application logic here DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); domFactory.setNamespaceAware(true); DocumentBuilder builder = domFactory.newDocumentBuilder(); Document doc = builder.parse("root.xml"); XPath xpath = XPathFactory.newInstance().newXPath(); // XPath Query for showing all nodes value XPathExpression expr = xpath.compile("/root/name/text()"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; for (int i = 0; i  outputs the current's node sibling */ expr = xpath.compile("./address/text()"); Object result1 = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes1 = (NodeList) result1; for (int j = 0; j < nodes1.getLength(); j++) { System.out.println(" ---------------- " + nodes1.item(j).getNodeValue()); } } } } 

提前致谢

首先,如果您使用正确形成的xml运行代码,应该关闭名称地址和专业标记,或者在尝试解析它时会出错,这将是一件好事。 其次,如果你想选择节点的文本子节点,你需要确保那里有实际的东西,所以你的xml应该是这样的:

  hi 
hi
hi

现在,你有什么选择name元素的文本是好的,所以从你的IS that possible here ??开始IS that possible here ?? 评论你需要做一些改变。

如果要评估相对XPath,则不希望将文档对象传递给XPath的evaluate方法。 正在评估XPath的当前位置由您为其提供的项目确定,并且始终在根目录中评估文档对象。 如果要评估相对于特定节点,而不是为其提供文档,请为其指定该节点。

因此,对于evaluate方法调用,您会有类似这样的内容:

 Object result1 = expr.evaluate(nodes.item(i), XPathConstants.NODESET); 

接下来,您应该确保您的XPath实际上是正确的。 我们当前选择的节点是名称的文本节点。 这意味着我们需要首先转到名称节点而不是文本节点。 这个. XPath语法中的表达式选择当前节点,因此您所做的就是选择相同的节点。 您需要..表达式来选择父节点。

因此,对于我们当前的XPath,我们选择名称节点。 我们要做的是选择名称节点的sibilings的地址节点。 我们有两种方法可以做到这一点,我们可以选择名称节点的父节点,根节点和选择子节点的地址节点,或者我们可以使用XPath轴来选择兄弟节点(有关轴的信息可以是在这里找到http://www.w3schools.com/xpath/xpath_axes.asp )

如果我们要通过根节点,我们需要选择当前节点的父节点的父节点,以便../..它为我们提供根节点,后跟地址子节点: ../../address/text() address ../../address/text() ,它会给我们所有地址兄弟姐妹。

或者,使用轴,我们可以选择名称节点,然后选择../following-sibling::address (注意:这仅在地址节点位于名称节点之后才有效),然后选择文本使用../following-sibling:address/text()地址节点../following-sibling:address/text()

这给了我们这两行作为

 expr = xpath.compile("../../address/text()"); Object result1 = expr.evaluate(nodes.item(i), XPathConstants.NODESET); 

要么

 expr = xpath.compile("../following-sibling::address/text()"); Object result1 = expr.evaluate(nodes.item(i), XPathConstants.NODESET);