gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:13:54 25 4
gpt4 key购买 nike

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

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

例如如果我们读取 name 元素,我想添加 xpath 表达式 ="./address"为了输出“name”的同级而不使用 getNextSibling()/。

xml文件如下:

  <root>            
<name>
<address>
<profession>
</root>

我的代码如下:

  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 < nodes.getLength(); i++) {
System.out.println(" Name is : " + nodes.item(i).getNodeValue());

/* IS that possible here ?? */
/* ./address/text() => 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 应该看起来像这样:

<root>
<name>hi</name>
<address>hi</address>
<profession>hi</profession>
</root>

现在,您可以选择名称元素的文本,因此从您的 IS that possible here ?? 注释开始,您需要进行一些更改。

如果您想要评估相对 XPath,您不希望将文档对象传递给 XPath 的评估方法。评估 XPath 的当前位置由您赋予它的项目决定,并且文档对象始终在根处评估。如果您想相对于特定节点进行评估,而不是向其提供文档,而是向其提供该节点。

因此,您的评估方法调用将具有类似以下内容:

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

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

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

如果我们要遍历根节点,我们需要选择当前节点的父节点的父节点,因此 ../.. 为我们提供根节点,后跟地址 child :../../address/text(),这将为我们提供所有 sibling 的地址。

或者,使用轴,我们可以执行 .. 来选择名称节点,后跟 ../following-sibling::address (注意:这只适用如果地址节点位于名称节点之后),然后使用 ../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);

关于java - 使用 XPATH 表达式和 Java 解析 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18895262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com