2010-03-04 75 views
3

我試圖找出如何最好地翻譯這個:XML解析/ DOM操作在Java中

<Source><properties> 
    .... 
    <name>wer</name> 
    <delay> 
    <type>Deterministic</type> 
    <parameters length="1"> 
     <param value="78" type="Time"/> 
    </parameters> 
    </delay> 
    <batchSize> 
    <type>Cauchy</type> 
    <parameters length="2"> 
     <param value="23" type="Alpha"/> 
    <param value="7878" type="Beta"/> 
    </parameters> 
    </batchSize> 
... 
</properties></Source> 

分爲:

<Source><properties> 
    .... 
    <name>wer</name> 
    <delay> 
    <Deterministic Time="78"/> 
    </delay> 
    <batchSize> 
     <Cauchy Alpha="23" Beta="7878"/> 
    </batchSize> 
........ 
</properties></Source> 

我使用的DocumentBuilderFactory試過,但我在我可以訪問名稱標籤的值,我無法訪問延遲/批次部分中的值。這是我的代碼使用

Element prop = (Element)propertyNode; 

NodeList nodeIDProperties = prop.getElementsByTagName("name"); 
Element nameElement = (Element)nodeIDProperties.item(0); 

NodeList textFNList = nameElement.getChildNodes(); 
String nodeNameValue = ((org.w3c.dom.Node)textFNList.item(0)).getNodeValue().trim(); 

//-------- 
NodeList delayNode = prop.getElementsByTagName("delay"); 

調用getElementByName(「類」)或「參數」似乎並不返回任何東西我可以工作。我是否錯過了某些東西,或者是否有更簡單的方法來處理現有的xml。

需要使用定義的格式以允許Castor進行編組和解組。

任何幫助將不勝感激。

+4

這是更多的XML轉換,你不應該使用XSLT嗎? – saugata 2010-03-04 07:26:09

+1

我強烈建議使用XPATH來執行任何XML解析,但在我看來,它更符合邏輯。這是一個很好的教程(http://www.ibm.com/developerworks/library/x-javaxpathapi.html)。你能否詳細說明當你調用getElementsByName(「type」)時你到底得到了什麼? NullPointerExceptions /空字符串? – Luhar 2010-03-04 07:31:30

+0

你的標題是不正確的,你不解析,但操縱一個DOM樹。 – 2010-03-04 08:28:49

回答

5

有多種方式將XML轉換。

1)您可以使用XSLT (XSL Transformations)來轉換XML。它是一種基於XML的語言,用於轉換其他XML文檔,文本或HTML中的XML文檔。語法很難學。但是它是用於XML轉換的強大工具。 Here是一個教程。對於與Java一起使用XSLT,我會推薦Saxon,它還附帶了一個很好的文檔。使用XSLT的最大優點是轉換可以在單獨的模板中進行外部化。所以你的Java代碼不會被翻譯的東西混淆。但是,如前所述,學習曲線非常陡峭。

2)您可以使用XPath輕鬆選擇節點。 XPath是一種用於選擇XML文檔中的節點的查詢語言。順便說一句,XPath也用在XSLT中。例如。 XPath查詢

//delay[type = 'Deterministic']/parameters/param/@value 

選擇哪個都包含在一個節點param所有參數value它們是delay含有節點type帶有值「確定性」的子項。 Here是一個很好的Web應用程序,用於測試XPath查詢。 Here是一本如何在Java中使用XPath的教程,以及有關XPath的here。您可以使用XPath表達式在Java代碼中選擇正確的節點。恕我直言,這比直接使用DOM對象模型的可讀性和可維護性要高得多(這也是你已經學會的時間了)。

3)您可以使用SmooksXML transformations。如果轉換變得相當複雜,這特別有用。 Smooks從輸入XML填充對象模型,並通過使用Freemarker或XSL模板的模板機制輸出結果XML。 Smooks具有非常高的吞吐量,可用於ESB等高性能環境(例如JBoss ESB,Apache ServiceMix)。儘管如此,可能會被壓倒。

4)您可以使用Freemarker進行轉換。我沒有這方面的經驗,但據我所知,它可以用相當簡單。請參閱文檔的"Declarative XML processing" section(也可參閱"Exposing XML documents"以瞭解如何閱讀源XML)。對我來說似乎很簡單。如果你用這種方法試試你的運氣,我很樂意聽到它。

+0

你總結了上面其他人所說的話。謝謝。我將研究XSLT,並且如果曲線太陡(有點時間緊迫),那麼我將使用XPath查詢。 謝謝。 – Babyangle86 2010-03-04 07:57:14

+0

我看到了。所以我增加了一些資源。 Freemarker似乎在你的場景中非常有用...... – spa 2010-03-04 08:08:15

+0

如果你熟悉LISP-y語言,XSLT並不差。 – 2010-03-04 08:29:42

0

XSLT是到底前進的道路。其實很容易使用,而w3schools的例子是一個很好的開始。