java xml文件内容替换_你推荐什么Java XML库(替换dom4j)?

你推荐什么Java XML库(替换dom4j)?

我正在寻找像dom4j这样的东西,但没有dom4j的瑕疵,例如文档不好或丢失,看似停滞的开发状态。

背景:我一直在使用和提倡dom4j,但是我觉得它并不完全正确,因为我知道库远非最佳(例如:看看XSLT相关样式表类中的方法是如何记录的;你会传递什么来运行( )作为org.w3c.dom参数?)

要求:与使用纯JDK(org.w3c.dom和org.w3c.dom软件包)相比,该库应该使基本的XML处理更容易。 这样的事情:

将XML文档(从文件或字符串)读入对象,轻松遍历和操作DOM,执行XPath查询并针对它运行XSLT。

在Java代码中构建XML文档,添加元素,属性和数据,最后将文档写入文件或字符串。

我真的很喜欢dom4j所承诺的,实际上:“易于使用的开源库,用于处理XML,XPath和XSLT [...],完全支持DOM,SAX和JAXP。” 即将推出的dom4j 2.0确实声称可以解决所有问题:充分利用Java 5并添加缺少的文档。 但不幸的是,如果你仔细观察:

警告:dom4j 2.0处于pre-alpha状态   阶段。 可能它不可能  编译。 如果它可以编译   随机它可能无法运行。   如果它偶尔运行它可以   突然爆发。 如果你想使用   dom4j,你想要1.6.1版本。 真。

......并且网站已经说了很长时间了。 那么有没有一个很好的替代dom4j? 请为您的首选库提供一些理由,而不是仅仅转储名称和链接。:-)

Jonik asked 2019-05-06T05:17:48Z

11个解决方案

53 votes

当然,XOM :-)

XOM旨在易于学习   而且易于使用。 它很有效   直截了当,并且非常   浅学习曲线。 假设   你已经熟悉XML了   应该能够起床和运行   与XOM很快。

我现在使用XOM几年了,我仍然非常喜欢它。 易于使用,大量文档和Web上的文章,API在版本之间不会改变。 1.2最近发布。

XOM是唯一没有的XML API   妥协正确性。 仅限XOM   接受命名空间格式良好的XML   文件,只允许你   创建命名空间格式良好的XML  文档。 (事实上,它有点儿   比那更严格:它实际上   保证所有文件都是   圆形的,有明确的定义   XML信息集。)XOM管理您的XML   你不必。 使用XOM,您可以   专注于你的独特价值   应用程序,并信任XOM来获取   XML正确。

查看网页[http://www.xom.nu/]了解常见问题,食谱,设计原理等。如果只有一切设计都有这么多的爱:-)

作者还写了关于XML API的错误(以及如何修复它们)的文章。 (基本上,首先存在XOM的原因)

以下是Artima对作者关于XOM的五部分采访,他们谈到了XML API,好的,坏的和DOM的错误,JDOM的设计评论,JDOM的经验教训以及最终的设计原则和XOM。

Peter Štibraný answered 2019-05-06T05:18:44Z

17 votes

JDK中内置的一个...添加了一些。

是的,使用起来很痛苦:它是根据委员会明确设计的W3C规范建模的。 但是,它可以在任何地方使用,如果你坚持下去,你就不会遇到“我喜欢Dom4J”,“我喜欢JDOM”,“我喜欢StringBuffer”这些来自第三方库的论点。 特别是因为这些参数可以使用不同的库变成不同的代码片段......

但是,正如我所说,我的确略有增强:实用XML库是一组实用程序类,可以更轻松地使用DOM。 除了XPath包装器之外,这里没有什么复杂的东西,只是我发现自己为每个工作重写的一堆例程。

kdgregory answered 2019-05-06T05:19:24Z

10 votes

我一直在使用XMLTool替换Dom4j,它运行得很好。

XML Tool使用Fluent Interface模式来促进XML操作:

XMLTag tag = XMLDoc.newDocument(false)

.addDefaultNamespace("http://www.w3.org/2002/06/xhtml2/")

.addNamespace("wicket", "http://wicket.sourceforge.net/wicket-1.0")

.addRoot("html")

.addTag("wicket:border")

.gotoRoot().addTag("head")

.addNamespace("other", "http://other-ns.com")

.gotoRoot().addTag("other:foo");

System.out.println(tag.toString());

它是为Java 5制作的,并且很容易创建一个可迭代的对象选定的元素:

for (XMLTag xmlTag : tag.getChilds()) {

System.out.println(xmlTag.getCurrentTagName());

}

Gilberto Olimpio answered 2019-05-06T05:20:04Z

6 votes

我一直很喜欢jdom。 它被编写为比DOM解析更直观(并且无论如何SAX解析总是显得笨拙)。

从使命宣言:

没有令人信服的理由   用于操纵XML的Java API   复杂,棘手,不直观或者a   颈部疼痛。 JDOMTM都是   以Java为中心和Java优化。 它   表现得像Java,它使用Java   收藏品,这是完全自然的   适用于当前Java开发人员的API,以及   它提供了一个低成本的切入点   使用XML。

这几乎是我的经验 - 相当直观的节点树导航。

Steve B. answered 2019-05-06T05:20:52Z

5 votes

我使用XStream,它是一个简单的库,可以将对象序列化为XML,然后再返回。

它可以是注释驱动的(如JAXB),但它具有非常简单易用的API,您甚至可以生成JSON。

IAdapter answered 2019-05-06T05:21:23Z

3 votes

我将添加@kdgregory的内置答案,说为什么不是JAXB?

通过一些注释,可以很容易地为大多数XML文档建模。 我的意思是你可能要解析这些东西然后放入一个物体吧?

JAXB 2.0内置于JDK 1.6中,与许多其他内置javax库不同,这个非常好(Kohusuke使用它,所以你知道它的好处)。

Adam Gent answered 2019-05-06T05:22:02Z

2 votes

在最近的一个项目中,我不得不进行一些XML解析,最后使用了由同事推荐的Simple Framework。

最后我很满意。 它使用基于注释的方法将XML元素和属性映射到Java类和字段。

foo

bar

对应的Java代码:

@Root

public class Example {

@Path("a/b[1]")

@Element

private String x;

@Path("a/b[2]")

@Element

private String y;

}

它与dom4j或XOM完全不同。 你可以避免编写愚蠢的,经验丰富的XML处理代码,但是一开始你可能会在一段时间内试图让注释正确。

(4年前我问过这个问题。虽然XOM似乎是一个体面且非常受欢迎的dom4j替代品,但我还没有完全接受它。很奇怪没有人在这里提到过Simple Framework。我决定解决这个问题, 因为我可能会再次使用它。)

Jonik answered 2019-05-06T05:22:57Z

1 votes

在我们的项目中,我们使用[http://www.castor.org/],但仅用于小型XML文件。 它非常容易学习,只需要一个映射XML文件(如果XML标签匹配完美的类属性,则不需要),并且已经完成。 它支持侦听器(如回调)以执行其他处理。 缺点:它不是像JAXB那样的Java EE标准。

Lluis Martinez answered 2019-05-06T05:23:23Z

0 votes

您可以尝试JAXB,注释非常方便易用:用于XML绑定的Java体系结构。

Taran Singh answered 2019-05-06T05:23:49Z

0 votes

我有时使用Jericho,它主要是HTML解析器,但可以解析任何类似XML的结构。

当然,它仅适用于最简单的XML操作,例如查找具有给定名称的标记,迭代结构,替换标记及其属性,但这不是最常见的用例吗?

Danubian Sailor answered 2019-05-06T05:24:21Z

0 votes

为了构建XML文档,我建议使用xmlenc。 它用于cassandra。

Jingguo Yao answered 2019-05-06T05:24:46Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值