2012-06-04 268 views
1

在我正在處理的應用程序中,需要將一個XML文檔加載到內存中進行查詢。要做到這一點,我打電話XmlDocument.Load(string path),這一直工作正常。不過,我最近遇到了一些奇怪的行爲。XmlDocument.Load忽略元素?

我有一個生成的文件看起來像這樣(編輯刪除敏感數據):

*Snip* 
<Info name="name2" parent="name1" modifier="A"/> 
<Info name="name2" parent="name1" modifier="B"/> 
<Info name="name1" modifier="A"/> 
<Info name="name1" modifier="B"/> 
<Info name="name3" parent="name2" modifier="A"/> 
<Info name="name3" parent="name2" modifier="B"/> 
*Snip* 

上面有六個條目。但是,如果調用XmlDocument.Load,則只加載4個條目,而將前兩個條目排除。我已經通過斷點確認了這一點,並通過了數據調試器。

然而,當我手動重新排列文件中的數據是

*Snip* 
<Info name="name1" modifier="A"/> 
<Info name="name1" modifier="B"/> 
<Info name="name2" parent="name1" modifier="A"/> 
<Info name="name2" parent="name1" modifier="B"/> 
<Info name="name3" parent="name2" modifier="A"/> 
<Info name="name3" parent="name2" modifier="B"/> 
*Snip* 

的所有數據被正確地加載,沒有元件被排除在外。 據我所知,文檔格式良好,加載時沒有拋出異常。還應該注意的是,當我爲所有條目人爲地添加一個parent屬性時,它們都會正確加載,但是如果我正確理解了XML,那就沒有關係,它只會使代碼中缺失的屬性無效。此外,沒有爲任何元素指定名稱空間。

這是預期的行爲,還是我錯過了什麼? 如果需要,我可以提供更多細節。

回答

1

我只是想你的例子這樣:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<root><Info name=\"name2\" parent=\"name1\" modifier=\"A\"/><Info name=\"name2\" parent=\"name1\" modifier=\"B\"/><Info name=\"name1\" modifier=\"A\"/><Info name=\"name1\" modifier=\"B\"/><Info name=\"name3\" parent=\"name2\" modifier=\"A\"/><Info name=\"name3\" parent=\"name2\" modifier=\"B\"/></root>"); 
int count = doc.SelectNodes("//root/Info").Count; 

它工作得很好。它返回值6,這是正確的數字。自己嘗試一下。如果它不適合你,那麼你的安裝必須有一些棘手的問題。但是,如果我懷疑它的確如此,那麼問題一定是別的。

嘗試從小的開始,並增加更多的複雜性,直到失敗。要麼是導致它的XML有其他錯誤,要麼是從XmlDocument對象讀取節點的方式存在錯誤。

+0

原來你是對的,在別處有一個不相關的方法是刪除節點。我使用你的代碼來發現差異。謝謝! –