使用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);