2011-10-25 50 views
0

我有java服務,應該收到一個包含多個元素的xml文件。我需要分析這個文件提取匹配的元素,並將它們發送到他們的相關服務。如何分析一個XML文件?

我希望找到一個輕鬆的方式來做到這一點,因爲它是一個沉重的XML文件。

任何人都知道一個java框架或解決方案,可以幫助執行?

感謝

+0

該文件有多大? (文件大小,元素數量)。如果它在Web服務中通過線路,它應該太大(<25Mb)。常規的XML DOM解析器適用於大多數25Mb的文件,然後考慮SAX。它必須是一個超過SAX功能的大文件(> 1Tb)。 –

+0

嘗試vtd-xml,您不會對此感到失望。 –

回答

0

Apache Commons Digester

定義你的自定義規則來讀取XML文件,並調用方法或創建對象來解組。

/students/student -> new Student(); 
/students/student/name -> invoke setName(name) for student 
/students/student -> invoke addStudent(student) for each student 

一切都是可選的,你定義一個http://commons.apache.org/digester這種需求

測試, examplehttp://www.javaworld.com/javaworld/jw-10-2002/jw-1025-opensourceprofile.html?page=2example

1

XPath可能是一個很好的解決方案。以下是API文檔的鏈接,但您也可以找到許多不同的教程和入門指南。只需在Google上搜索「Java XPath教程」或類似內容即可。

http://download.oracle.com/javase/1,5.0/docs/api/javax/xml/xpath/package-summary.html

有可能的XPath可能更適合您的需求的其他幾個實現,所以這將是值得關注其他開源實現。

+0

不過,他需要有一種應用XPath表達式的方法。在Java中直接使用XPath通常意味着構建一個DOM,這將對大型XML文檔造成沉重的內存損失。 –

+0

是的,我想避免將XML文件解組爲Java對象,因爲它將使用大量內存 – achraf

+1

我不知道有關Java XPath API的大量信息,但我不認爲XPath的所有實現都需要您加載整個XML圖形一次寫入內存。內核中的XPath實際上並不需要您將整個輸入或輸出一次加載到內存中,這可能只是一個實現細節。 Java SDK中的XPath impl可能會這樣做,但是您可能能夠找到對大型輸入文件更好的impls。我的答案旨在提供一個選項來看,可能會有性能影響,會導致您尋找其他東西。 –

0

將它傳遞給XSLT樣式表。 Java XSLT實現非常好,將輸入樹保持在最低限度,並且通常使用(至少默認情況下)字節碼編譯,而不是解釋來使轉換真的很快。匹配輸入和生成所需的輸出正是XSLT適用的聲明式風格。

0

您可以嘗試獲取XML文件的DOM樹,然後可以使用this遞歸方法遍歷樹來查找您想要的內容。

+0

這會起作用,但是如果XML確實很重,那麼對於VM內存來說,DOM樹可能太多了。 – Yuval

+0

是的,我想你說得很對。抱歉achraf。 – temelm

1

有幾十種方法可以讀取Java中的XML文件。有幾個的人只是Java SE的做到這一點:

  • SAX
  • DOM
  • StAX的
  • JAXB

谷歌爲他們:你會發現文檔和教程。 api doc也是有幫助的。你會在軟件包名稱中找到所有這些工具。

+1

謝謝JB,SAX和STAX看起來很有趣 – achraf

0

使用JDOM,它小巧,快速,易於使用。