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

时间:2011-02-08 19:40:30

标签: 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的任何建议?

1 个答案:

答案 0 :(得分:3)

正如@biziclop所建议的那样,就编程时间而言,XPath将是一种有效的方法(也可能就CPU时间而言)。

Java 5中的

Here is a primer on using the javax.xml.xpath package

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

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...
}