gpt4 book ai didi

java - 使用 xpath 读取多个 XML 属性

转载 作者:行者123 更新时间:2023-12-02 11:50:35 25 4
gpt4 key购买 nike

假设我有这样的东西:

<info>
<collectorKey id="key"/>
<credentials user="user" password="password"/>
<Infos>
<dummyInfo>
<infoSource temp="N/A">
<tags>
<tag id="1" value="example"/>
<tag id="2" value="example"/>
<tag id="3" value="example"/>
<tag id="4" value="example"/>
<tag id="5" value="example"/>
<tag id="6" value="example"/>
<tag id="7" value="example"/>
</tags>
</infoSource>
</dummyInfo>
</Infos>
<Infos>
<dummyInfo>
<infoSource temp="N/A">
<tags>
<tag id="1" value="example"/>
<tag id="2" value="example"/>
<tag id="3" value="example"/>
<tag id="4" value="example"/>
<tag id="5" value="example"/>
<tag id="6" value="example"/>
<tag id="7" value="example"/>
</tags>
</infoSource>
</dummyInfo>
</Infos>
</info>

我想获取 ID 为 2 的每个标签属性并获取该标签的值。现在我有一些冗长的代码来完成它,但它看起来不太实用。如果可能的话我想将其转换为使用 xpath 我想知道这是如何完成的。我将一些框架代码放在一起,但它并没有将我的标签值设置为 2。我认为需要添加一些循环以及一些更改。

类似于:

try {
ClassLoader classLoader = getClass().getClassLoader();
File configProdXML = new File(classLoader.getResource("files/config-prod.xml").getFile());

//parse it using a docbuilder
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = null;
dBuilder = dbFactory.newDocumentBuilder();
Document parsedConfig = dBuilder.parse(configProdXML);

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("/tags/tags/@id=2/text()");

System.out.println(expr.toString());

旁注。 xpath 是最实用的吗?

最佳答案

是的,XPath 非常适合这样做:

XPathExpression expr = xpath.compile("//tags/tag[@id=2]/@example");

一些解释:

  • //tags 中的两个斜杠表示全部<tags>文档中任意级别、任意位置的元素。
  • tag[@id=2]意味着 <tag>元素,但带有一个谓词来限制哪些元素符合条件。

通常,没有必要直接调用 XPath.compile,除非您计划将相同的 XPath 应用到许多不同的源。您只需调用evaluate即可直接方法:

NodeList values = (NodeList)
xpath.evaluate("//tags/tag[@id=2]/@example", parsedConfig,
XPathConstants.NODESET);

警告:切勿调用 URL.getFile()。它不会将 URL 转换为有效的文件名 - 它只是返回主机和端口之后的 URL 部分,其中可能包含许多不允许出现在 URL 中的字符的百分比转义符。另外,Class.getResource 或 ClassLoader.getResource 返回的 URL 根本不保证指向文件;特别是,如果您尝试从 .jar 文件运行,您将不会得到 file:网址。

幸运的是,您不需要文件。您甚至不需要解析文档。您可以直接将 InputStream 传递到您的 XPath:

try (InputStream config = getClass().getResourceAsStream("/files/config-prod.xml")) {

NodeList values = (NodeList)
xpath.evaluate("//tags/tag[@id=2]/@example", new InputSource(config),
XPathConstants.NODESET);

int count = values.getLength();
for (int i = 0; i < count; i++) {
String value = values.item(i).getNodeValue();
System.out.println("Found value \"" + value + "\"");
}
}

关于java - 使用 xpath 读取多个 XML 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47898057/

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