我从不喜欢XML,并且总是试图避免它。而这一天终于来了。
当我尝试解析XML时,真的很难。我使用DOM解析器,当我调用getChildNodes()
的{{1}}时,它返回Node
。我在使用XPath时不得不使用强制转换。
是否存在类似于WebDriver的WebElement机制的Java XML解析库,其中NodeList
返回getChildNodes()
(或Collection,Iterable等),我不需要进行转换。在其他单词,是否有一个优雅而简单的XML解析器库。
图书馆可以只读,我不需要操纵。
答案 0 :(得分:3)
我会调查JDOM作为更实用的API。
e.g。 Element.getChildren()
会返回Element
个对象的列表(不幸的是,不已被通用化,但API文档已明确)。
dom4j是另一种选择(同样,不是通用的)。
答案 1 :(得分:2)
这实际上取决于您使用XML的目的。例如,在我刚刚开始的项目中,我们为应用程序编写了后端功能。我们通过Web服务和SOAP发送/接收消息。当我设置它时,我使用了Spring-WS和JAXB注释。因此,它自动将SOAP XML转换为来自/来自后端的Java对象。这意味着虽然团队的其他成员在概念上知道发生了什么,但他们是从实际的SOAP请求中得到的,除非他们想要查看它们以进行调试等等。我们的代码都没有直接处理XML,只处理通过JAXB生成的对象。
有意义吗?
答案 2 :(得分:0)
我也会使用JAXB。但是如果你有一个与你的XML相关联的模式(或者可以创建一个模式),你可以使用jaxb编译器xjc来构建Java类来表示你的XML结构。然后很容易解析和导航XML。这是上述方法的替代方法,因为您的代码中没有任何注释。
答案 3 :(得分:0)
如前所述,这实际上取决于你打算做什么。
如果要将XML架构映射到Java bean,并自动将XML文件解析为这些bean的实例,则可以使用JAXB,XMLBeans。
如果您只想解析简单的XML文件并动态处理它们,可以使用JDOM,DOM和SAX的替代方案。
它使您能够检索List
元素:
Iterator itr = (currentElement.getChildren()).iterator();
while(itr.hasNext()) {
Element oneLevelDeep = (Element)itr.next();
List twoLevelsDeep = oneLevelDeep.getChildren();
// Do something with these children
}
答案 4 :(得分:0)
您可能会发现JDOM API比JDK嵌入式DOM API更直观,更易于使用。不幸的是,API没有为返回的集合/列表使用泛型,因此您仍然需要对返回值进行一些转换。
答案 5 :(得分:0)
dom4j开始使用泛型,而Collection则使用2.0版。
文档对于2.0来说不是很好,但旧文档很好用。