我有一个具有稳定树结构和超过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?
答案 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]"