Dom4j vs JAXB用于读取和更新大型复杂的XML文件

时间:2015-06-22 09:48:21

标签: java xml xml-parsing jaxb dom4j

我有一个具有稳定树结构和超过5000个元素的XML文件。

其中一小部分如下:

<Companies>
    <Offices>
        <RevenueInfo>
            <TransactionId>14042015014606877</TransactionId>
            <Company>
                <Identification>
                    <GlobalId>25142400905</GlobalId>
                    <BranchId>373287734</BranchId>
                    <GeoId>874</GeoId>
                    <LastUpdated>2015-04-14T01:46:06.940</LastUpdated>
                    <RecordType>7785</RecordType>
                </Identification>
                <Info>
                    <DataEntry>
                        <EntryId>12345</EntryId>
                    </DataEntry>
                    <DataEntry>
                        <EntryId>34567</EntryId>
                    </DataEntry>
                    <DataEntry>
                        <EntryId>89076</EntryId>
                    </DataEntry>
                    <DataEntry>
                        <EntryId>13211</EntryId>
                    </DataEntry>
                </Info>

                ...more elements

            </Company>
        </RevenueInfo>
    </Offices>
</Companies>

我需要能够根据用户输入更新文档中的任何值,并使用更新的信息创建新的XML文件。用户将传递 BranchId ,要更新的元素的名称以及如果多个出现的元素的订单数量(例如,对于 EntryId 12345,用户将通过373287734 EntryId=1 010101

我一直在关注JAXB,但是为这种XML创建模型类似乎付出了相当大的努力,但它似乎也会使打印到文件并定位元素以便更新更容易。

Dom4j似乎也有很好的性能结果,但不确定如何解析。

我的问题是,在这种情况下,JAXB是最好的方法,还是可以建议一种更好的方法来解析这种类型的XML?

2 个答案:

答案 0 :(得分:2)

根据我的经验,JAXB仅在架构简单且稳定时才能正常工作。在其他情况下,最好使用通用树模型。 Java世界中的主要通用模​​型是DOM,JDOM2,DOM4J,XOM,AXIOM。我自己的偏好是JDOM2和XOM;在我看来,DOM4J过于复杂,有些过时了。但这取决于你在寻找什么。

但是,您描述的应用程序看起来是#End; XML端到端的理想候选者。或XRX方法 - XForms,XSLT,XQuery,XProc。你根本不需要Java。

答案 1 :(得分:0)

不考虑性能和内存要求,我建议尝试与DOM4J(或JDOM,甚至是纯DOM)一起使用XPath。要选择公司,您可以使用这样的XPath表达式:

"//Company[Identification/BranchId = '373287734']"

然后,使用返回的公司元素作为上下文,您可以使用另一个XPath表达式来更新元素:

"//EntryId[position() = 1]"