2011-08-11 35 views
1

我有複雜的XML樹,我想「重新分析」。我想要的是讓所有具有給定屬性的對象(讓我們說「類型」),並獲得它們之間的關係。這意味着 - 它想要重新創建僅具有類型屬性的元素的樹結構。另外(這就是爲什麼我不能使用例如XSLT)我必須從基本XML樹中將新創建的對象(帶有類型的元素)引用到節點(元素)。簡化XML樹 - 獲取元素之間的關係

我檢查compareDocumentPosition方法,但它只能在線位置基地,而不是在樹的關係

回答

1

這很有趣!如果我理解正確的問題,你要轉換

 
        Root        Root 
       / \       / \ 
       N  T2   --->    T1  T2 
      / \ / \        /
      N T1 T3 N        T3 

如果是這樣,我想你可以做這樣的事情:

  1. 選擇,使用XPath或許,某些屬性的所有元素,並將其轉換到集
  2. 去除未在該組
  3. 所有葉節點遍歷樹bootom-向上,向上移動每個葉,直到它的母體或者是根或所選節點
  4. 重複步驟f rom 2.直到沒有未選擇的葉節點
+0

我不確定你在第2步中的意思,但總體想法看起來不錯。唯一的問題是 - XPath NodeSet結果是否會被罰款?我的任務更加複雜 - 實際上,我必須使用自定義對象(這些對象具有對左側節點的引用)重新創建右側顯示的樹。重新創建樹意味着我的對象本身就是樹項目(parentNode + childNodes)。所以,如果我想生成基於xml節點的自定義對象,我必須確定它已經存在。 –

+0

但是......如果我有XPath查詢,對於給定節點(例如從你提到的集合中獲取的)將會告訴我哪個節點是他的真正父節點(具有給定屬性的第一個父節點),那麼一切都會更簡單。這個查詢是否存在? –

+0

嗯,是的,這就像'ancestor :: * [@ type] [1]',即'type'屬性的'最近的'祖先 –

0

我不知道,如果您有任何限制,但它可能是值得解析XML成一個類或幾類,然後重寫XML如果您的給定類型== foo

+0

我使用全樹解析(childList; DFS),但它很吸引人的樣式,如果有可能,我寧願一些罰款的XPath表達式:) –

+0

你可以解析什麼時候attribute =「type」 [試試這個鏈接](http://www.mkyong.com/ java/how-to-read-xml-file-in-java-jdom-example /)不知道它是否有幫助 – Intern87