2013-06-12 163 views
0

我有一個結構類似這樣的XML文件:解析XML的深層嵌套數據

<element1> 
    <element2> 
     <element3> 
      <elementIAmInterestedIn attribute="data"> 
       <element4> 
        <element5> 
         <element6> 
          <otherElementIAmInterestedIn> 
           <data1>text1</data1> 
           <data2>text2</data2> 
           <data3>text3</data3> 
          </otherElementIAmInterestedIn> 
         </element6> 
        </element5> 
       </element4> 
      </elementIAmInterestedIn> 
      <elementIAmInterestedIn attribute="data"> 
       <element4> 
        <element5> 
         <element6> 
          <otherElementIAmInterestedIn> 
           <data1>text1</data1> 
           <data2>text2</data2> 
           <data3>text3</data3> 
          </otherElementIAmInterestedIn> 
         </element6> 
        </element5> 
       </element4> 
      </elementIAmInterestedIn> 
      <elementIAmInterestedIn attribute="data"> 
       <element4> 
        <element5> 
         <element6> 
          <otherElementIAmInterestedIn> 
           <data1>text1</data1> 
           <data2>text2</data2> 
           <data3>text3</data3> 
          </otherElementIAmInterestedIn> 
         </element6> 
        </element5> 
       </element4> 
      </elementIAmInterestedIn> 
     </element3> 
    </element2> 
</element1> 

正如你所看到的,我感興趣的兩個元素,深深嵌套在根目錄中,其第一元素,第二個元素深深地嵌套在第一個元素中。文檔中有多個(同胞)elementInmInterestedIn和otherElementIAmInterestedIn元素。

我想用Java解析這個XML文件,並將來自所有元素的所有元素(包括元素)的數據放入數據結構或Java對象中 - 只要它是有組織的並且我可以稍後訪問它。

我能夠編寫一個遞歸的DOM解析器方法,該方法對XML進行深度優先遍歷,以便觸及每個元素。我還編寫了一個帶有代表elementInmInterestedIn的JAXB註釋的Java類。然後,在遞歸方法中,我可以檢查何時到達元素ImInterestedIn並將其解組爲JAXB類的實例。這工作正常,除了這樣一個對象還應該包含多個otherElementIAmInterestedIn。

這是我卡住的地方。如何從其他ElementlemInterestedIn中獲取數據並將其分配給JAXB對象?我看過@XmlWrapper註解,但這似乎只適用於一層嵌套。另外,我不能使用@XmlPath。

也許我應該抓住這個想法,並採用一種全新的方法。我真的剛剛開始使用XML解析,所以也許我忽略了一個更明顯的解決方案。你將如何解析這樣的XML文檔並以有組織的方式存儲數據?

+0

有用於遍歷/查詢XML XPath標準。我沒有用過,所以我不能確保任何東西,但我會說這可能是一個好主意使用谷歌搜索 – SJuan76

+0

你想讓你的Java模型看起來像什麼?你是否還需要支持將對象寫回XML? –

+0

我想理想的是有一個類表示elementIAmInterestedIn,具有屬性和任何直接子元素的私有變量。我想我可以爲此使用JAXB。但其中一個私有變量必須是另一個表示otherElementIAmInterestedIn的類的實例列表。 我不需要支持將對象寫回XML。 – user1015721

回答

1

也許你應該使用SAX解析器而不是DOM。當您使用DOM時,您將加載內存中的所有文檔,而在您的情況下,您只需要讀取2個字段。這是非常低效的。 。

使用SAX解析器,你就可以只讀那些你感興趣的節點下面是使用SAX解析模型您的任務僞代碼:

1)繼續閱讀節點,直到你得到<elementInterestedIn>節點

2)抓住該領域在你的類

3)繼續閱讀,直到你得到<otherElementInterestedIn>節點

4)抓住該領域也和保存對象。

從1循環到4,直到它到達文檔的末尾。

如果嘗試這種形式給出,建議你先閱讀本文檔,瞭解SAX解析器是如何工作的,這是由DOM的形式給出了完全不同的:How to Use SAX