【发布时间】:2012-05-28 05:28:18
【问题描述】:
我的问题是:当存在与父元素的“孙子”同名的其他元素时,如何直接获取特定父元素下的元素。
我正在使用 Java DOM library 解析 XML Elements,但遇到了麻烦。这是我正在使用的 一些(一小部分)xml:
<notifications>
<notification>
<groups>
<group name="zip-group.zip" zip="true">
<file location="C:\valid\directory\" />
<file location="C:\another\valid\file.doc" />
<file location="C:\valid\file\here.txt" />
</group>
</groups>
<file location="C:\valid\file.txt" />
<file location="C:\valid\file.xml" />
<file location="C:\valid\file.doc" />
</notification>
</notifications>
如您所见,您可以在两个地方放置<file> 元素。无论是在组内还是在组外。我真的希望它采用这种结构,因为它对用户更友好。
现在,每当我调用notificationElement.getElementsByTagName("file"); 时,它都会为我提供所有<file> 元素,包括<group> 元素下的元素。我以不同的方式处理这些文件中的每一种,所以这个功能是不可取的。
我想到了两种解决方案:
- 获取文件元素的父元素并进行相应处理(取决于是
<notification>还是<group>。 - 重命名第二个
<file>元素以避免混淆。
这些解决方案都不像只是让事物保持原样并仅获得作为<notification> 元素的直接子元素的<file> 元素那样可取。
我愿意接受 IMPO cmets 并回答有关“最佳”方法的问题,但我真的对 DOM 解决方案很感兴趣,因为这就是其余的这个项目正在使用。谢谢。
【问题讨论】:
-
为什么不使用 XPath 来获取两个节点列表并区别对待?
//groups/group/file和//notification/file足以拥有它们。还是您只需要一个 XPath 来获取它们? -
为什么不通过你自己的循环来创建这个集合,比如点击:"NodeList nodes = element.getChildNodes(); for (int i = 0; i
-
@Alex org.w3c.dom 不支持 XPath;他想为此使用不同的库,例如 org.jdom.xpath……尽管我完全同意这是更优雅的方法。
-
javax.xml.xpath是Java Standard,所以我认为他几乎可以使用它,不需要为了这个简单的任务而获得JDom。 -
我应该提一下,这只是一个更大的 xml 文件的一小部分 :) 想让它可读。
标签: java xml parsing dom xml-parsing