2017-01-10 80 views
0

我將添加到以下線程,但這會違反論壇規則「但請避免要求幫助」。 how to identify for the xml end tag while parsing using DOM?如何在XML DOM節點樹中確定元素的結尾

在上面的線程中的問題也是我的。另一種方法是知道如何捕獲「GroupName」,並且每個組中的每個組都繞過<歷史記錄> </History>中的所有信息。

我正在使用Excel 2016 VBA。 KeePass XML沒有已知的模式。

下面列出了一個由KeePass XML文件的高級元素組成的簡單節點樹,以提供一些清晰的表象。爲簡單起見,入口細節(兒童)和大多數節點被忽略。

<KeePassFile> 
 
    <Root> 
 
     <Group> 
 
     <Group> 
 
      <Name>GroupName</Name> 
 
      <Entry> 
 
       <History> 
 
        <Entry> 
 
        </Entry> 
 
        <Entry> 
 
        </Entry> 
 
       </History> 
 
      </Entry> 
 
      <Entry> 
 
      </Entry> 
 
     </Group> 
 
     </Group> 
 
     <DeletedObjects /> 
 
    </Root> 
 
</KeePassFile>

原因我嘗試加載使用Excel VBA與XML DOM庫KeePass的XML文件到Excel中。似乎沒有模式,各種「級別」使用相同的節點E.G.我嘗試使用XPath,但無處可去。 getElementsByTagName看起來很有希望,甚至可以用於兩個元素,但是當第二個條目完成時,parent.nextsibliing就會陷入僵局。

由於<歷史> </History>之間沒有任何信息,所以我可以確定下一個兄弟和下一個兄弟,並使用到達的兩個節點中的第一個「確定」結束。

我也可以假定所有緊跟</Entry>的元素都已知並使用它們。我知道<條目>,<歷史記錄>和< DeletedObjects>但其他可能存在。

+0

最好包含一些您已經嘗試過的代碼,並準確描述問題所在。現在你的問題看起來像一個非常標準的XML解析練習,沒有棘手的部分。 –

回答

0

DOM是數據的樹型視圖。此樹中的元素節點對應於開始標記/結束標記對,節點的子節點表示在開始標記和結束標記之間找到的所有內容。因此,在DOM(或其他更現代的樹模型)中沒有單獨表示開始標記和結束標記:兩個標記被摺疊爲單個節點對象。 (這可以解釋爲什麼很多人濫用「tag」這個詞來表示「元素節點」)。

如果你想忽略歷史元素,只需忽略元素節點,你不必擔心開始和結束標籤。

+0

我可能已經想出了一種方法。稍後發佈,如果有效的話。也許你可以指向另一個方向或改進我的方法。由於600個字符的限制,只會顯示摘錄。爲了實際看到我正在使用XML將KeePass(可從Sourceforge獲得)文件導出的XML示例。 – ExpertNovice

+0

有簡單KeePass XML的代碼工作,但它目前在更復雜的版本上失敗,其中有4個「級別」,而有6個。由於字符限制,無法發佈代碼示例。只需要轉換爲使用對象,因爲我仍然使用childnodes.item(0)格式的一些代碼,因爲我還沒有想出如何使用SingleSelectNode,它應該有助於處理那些更深的節點。對不起,麻煩了。感謝迴應。 – ExpertNovice

+0

這聽起來像是一個新問題,所以發佈一個新問題,並提供足夠的信息,以便人們有合理的機會確定出錯地點。 –