java - 获取带有 id 或 name 的 XML 节点
问题描述
我有以下 xml 文件
<Capabilities>
<Capability id="test" name="test">
<File Path="bin/test.exe" />
<File Path="bin/abc.dll" />
<File Path="bin/xyz.dll" />
<File Path="LICENSE" />
<File Path="third-party-programs.txt" />
</Capability>
<Capability id="test1" name="test1">
<File Path="bin/test1.exe" />
<File Path="LICENSE" />
<File Path="third-party-programs.txt" />
</Capability>
<Capabilities>
我想获取 id="test1" 的节点,但不遍历所有节点。我尝试在java中使用以下
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
document = documentBuilder.parse(xmlFile);
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
// get the node with id="test1"
Node capabilityNode = document.getElementById("test1");
从上面的代码我得到空值。getElementbyId 文档说 id 属性必须具有类型 ID。如何确保 id 是 ID 类型,或者有没有办法可以直接获取节点而无需按名称循环?
谢谢
解决方案
您可以getElementById
使用XPath
. 此函数将返回第一个id
具有 value属性的元素idValue
。
public static Node getElementById(Document document, String idValue) throws XPathExpressionException {
XPath xpath = XPathFactory.newInstance().newXPath();
return (Node) xpath.evaluate(String.format("//*[@id='%s']", idValue), document, XPathConstants.NODE);
}
推荐阅读
- c - 使用 C 查找字符串中的所有回文
- ruby-on-rails - Rails 自定义字体未加载。我需要预编译吗?
- jenkins - 列出不使用丢弃旧版本的作业
- css - Bootstrap 模态可见性对反应中的按钮没有响应
- string - 如何用sed将字符串中的所有拉丁字母单词加倍?
- c - 如何从C中的文本文件中读取十六进制数据
- node.js - 将 Socket.io 与 React Native 一起使用并且无法正常工作
- angular - 是否可以在 Angular 之外使用 Angular 模板编译器?
- angular - 无法按照教程获得 angular-in-memory-web-api 0.6.1 工作
- macos - macOS 10.14:找不到 stdio.h