簡體   English   中英

在Java中讀取XML的最佳方法

[英]Best way to read XML in Java

從我們的一些其他應用程序,我得到XML文件。

我希望逐節點地讀取該XML文件,並將數據庫中的節點值存儲起來以供進一步使用。

那么,使用Java讀取XML文件和檢索節點值的最佳方法/ API是什么?

有各種各樣的工具。 今天,我更喜歡兩個:

這是Simple和JAXB之間的一個很好的比較: http//blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-simple.html

就個人而言,我更喜歡Simple更好,因為Niall的支持非常好,但是JAXB(如上面的博客文章中所解釋的)可以用更少的代碼產生更好的輸出。

StAX是一個更基本的API,它允許您讀取不適合RAM的XML文檔(Simple和JAXB都不允許您“逐個對象”讀取XML文檔 - 它們總是會嘗試一次性將所有內容加載到RAM中)。

如果你可以管理,我會建議一個簡單的XML工具。

例如,我和我的大學引入了復雜的XML框架,起初就像一個魅力。 然后你忘記了框架,你有專門的構建文件,只是為了將XML映射到bean,你有注釋bean,你為項目的新開發人員提供了新的障礙。 你失去了很多重構的自由。

最后你會感到遺憾的是,你使用復雜的框架在開始時節省了一些時間,我不止一次看到框架在重構中被拋棄了,因為每個人都對它有負面的感覺,盡管他們很擅長紙。

因此,如果您很少使用復雜的XML框架,請三思而后行。 如果您和您的團隊經常使用它們,那么它們就是您的選擇。

我建議使用XPath。 Xalan已經包含在JDK中(不需要外部jar),它符合您的要求,即迭代元素節點(我推測)並存儲它們的文本值。 例如:

    String xml = "<root> <item>One</item> <item>Two</item> <item>Three</item> </root>";

    XPathFactory xpf = XPathFactory.newInstance();
    InputSource is = new InputSource(new StringReader(xml));
    NodeList nodes = (NodeList) xpf.newXPath().evaluate("/*/*", is,
            XPathConstants.NODESET);
    for (int i = 0; i < nodes.getLength(); ++i) {
        Element e = (Element) nodes.item(i);
        System.out.println(e.getNodeName() + " -> " + e.getTextContent());
    }
}

此示例返回所有非根元素的列表,並打印出相應的元素名稱和文本內容。 調整xpath表達式以滿足您的需求。

試試Apache Xerces 它成熟而強大。 任何這樣的可用替代品也會這樣做,只是確保不推出自己的實現。

dom4jjdom很容易使用(暫時忽略“最佳”的要求;))

完全繞過解析xml並將值存儲在數據庫中的問題,我想質疑是否需要執行上述操作。 現在大多數數據庫都可以處理xml,因此它可以以某種方式存儲到表中而無需解析內容; 並且通常可以通過使用'xmlselect()'和類似函數來查詢表中列中的這種xml的內容。

想想這一秒; 如果在近期或遙遠的未來,您從其他應用程序獲得的xml內容發生了變化,您將需要進行大量更改。 如果它經常變化,它將成為一場噩夢。

干杯,Wim

試試XStream ,這個非常簡單。

好吧,我使用stax來解析相當多的XML節點,它比Dom和sax消耗更少的內存,因為它具有拉取XML數據的風格。 對於大型XML數據節點,Stax可能是一個不錯的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM