Java中xml.etree.ElementTree的等价物

12 投票
4 回答
3828 浏览
提问于 2025-04-15 15:36

我最近在用Python处理一些简单的XML,发现了ElementTree这个方法,觉得挺好用的。

那么在Java中有没有类似的、同样简单的方法呢?我觉得DOM模型有点复杂,写代码时总是要写很多不必要的内容才能完成简单的事情。

或者我问的问题不太对?

也许我想问的是:有没有比我看到的一些地方人们用来简化DOM代码的“XMLUtils”类更好的选择呢?


在这里补充一下我喜欢ElementTree的原因,因为问题被提出来了。

  • 简单(我想在使用DOM之后,任何东西看起来都简单)
  • 在Python中感觉很自然
  • 我需要写的代码非常少。

我想找个简单的代码例子来说明,但其实很难给出一个好的例子。不过我试试吧。这个例子只是给一个已有的XML字符串添加一个标签、一个值和一个属性。

from xml.etree.ElementTree import *
xml_string = '<top><sub a="x"></sub></top>'
parsed = fromstring(xmlstring)
se = SubElement(parsed, "tag")
se.text = "value"
se.attrib["a"] = "x"
new_xml_string = tostring(parsed)

之后,新的XML字符串是

<top><sub a="x" /><tag a="x">value</tag></top>

这个例子并没有涵盖所有内容,但还是有用的。当你想对标签进行操作时,循环处理标签也很简单,检查标签和属性是否存在也很容易。

4 个回答

1

你可以考虑以下几个替代方案:

dom4j

xom

jdom

因为我从来没有使用过ElementTree,所以不太清楚哪个更接近。如果你的项目中可以使用Groovy,它提供了一些类,可以在处理XML时帮助你很多。

1

我们发现XOM(http://www.xom.nu)提供了简单易用的可以被继承的元素功能。

6

说实话,Java里的所有XML接口都不好用,你只能选择自己愿意忍受的程度,可能会从非常糟糕、慢到可以接受、再到偶尔还不错。

这主要是因为Java的接口尽量遵循W3C DOM标准,实际上XercesJava当前的原生XML解决方案)以遵循一大堆与XML相关的W3C规范而自豪,你可以在他们的主页上看到。

不过,Xerces的接口使用起来非常不舒服,因此这些年来出现了很多其他的Java XML库。目前比较流行的有:

  • JDOM,大大简化了DOM操作,有时候甚至可以说使用起来很愉快,和Jaxen搭配使用效果很好——当然,前提是你没有遇到命名空间的问题
  • XOM,它对Java的XML问题有很好的分析,并提出了自己的解决方案。某种程度上,它实际上比JDOM更好,但目前还不够普及,所以不太清楚它在实际使用中的表现。不过,值得一试。
  • dom4j,这是一个功能全面的库,支持各种重要特性,是处理XML的务实解决方案。dom4j基本上是这些流行库中“老牌、可靠”的选择。

最后,我一定要提到StAX,因为它与众不同,实际上是一个基于事件的XML流式API。出于好奇,绝对值得一看。

顺便说一下,我现在正在写自己的XML解析器/导航器作为练习,但还没决定要用什么样的接口。我真的希望能做到易用,因为到目前为止,Java的XML接口似乎很少有这样的特点,但我还不太确定要提供什么样的接口。Python的ElementTree看起来很有趣,但因为我对它不太熟悉,你能简单说说你觉得它好用的地方吗?

撰写回答