java - 通过标签和属性查找节点的有效方法

标签 java xml

我必须更新一个严格定义(例如不能改变格式)的 XML 文档。我正在使用 DOM 解析器加载文件并在适当的位置进行更新。不幸的是,该文档确实为任何内容提供了 ID,所以我不得不使用 getElementsByTagName 来查找我需要更新的节点/元素。

我还没有遇到任何问题,但刚刚遇到了一段文字,例如:

<types>
  <type type_def_id="1" type_value="008" />
  <type type_def_id="6" type_value="uhl" />
  <type type_def_id="9" type_value="xpm" />
  <type type_def_id="11" type_value="4100" />
</types>

使用 getElementsByTagName,我需要遍历 NodeList 以找到我需要更新的 type_def_id,这似乎不是最佳方法。

有使用 Java 1.4 的建议吗?

最佳答案

正如@biziclop 所建议的那样,XPath 在程序员时间(以及可能在 CPU 时间方面)方面将是一种有效的方法。

Here is a primer on using the javax.xml.xpath package在 Java 5 中。

基于上述文章的代码示例为:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("myInput.xml");

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//type[type_def_id = '9']");

Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
    // do what you need to do...
}

关于java - 通过标签和属性查找节点的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4937513/

相关文章:

java - 它是一个正确的 JSON 文件吗?

java - 我想在执行 if block 时通知用户(移动应用程序)。这段代码不起作用,我的代码有什么问题?

java - Weblogic 服务器中的剩余端点问题

java - 在 Javax(在 JEE 下)上通过 Swagger 生成 API 文档?

java - 基本的 XML 到 HTML 转换

java - 在java中从txt读取变量

java - 无法解析 Hibernate + Spring 中的自定义验证消息

c# - 如何加载忽略未声明的命名空间的 XmlNode 对象?

xml - XSLT 确定哪个属性重复次数最多

javax.ejb.TransactionRolledbackLocalException(Glassfish 3 + JPA + EclipseLink)