2011-06-28 77 views
0

我不想使用XMLDocument,因爲我使用XMLWriter編寫了XML編寫代碼。所以應該沒有理由改變。C#XMLReader不能正確解析

<Player> 
    <Friends /> 
    <Ignores> 
    <Ignore>117779</Ignore> 
    <Ignore>44237636758361374</Ignore> 
    <Ignore>564534831</Ignore> 
    </Ignores> 
    <InventoryItems> 
    <Item> 
     <Slot>0</Slot> 
     <Id>995</Id> 
     <Amount>39493</Amount> 
    </Item> 
    <Item> 
     <Slot>27</Slot> 
     <Id>1049</Id> 
     <Amount>12</Amount> 
    </Item> 
    </InventoryItems> 
    <BankItems /> 
</Player> 

我試圖解析那裏。這是我到目前爲止。似乎到處打破我有它與<Ignore>'s工作了一點點,但那是當我使用ReadToFollowing而不是ReadToNextSibling,它會工作,直到ReadToFollowing擊中一個空行..它只會打到EOF。

XmlTextReader reader = new XmlTextReader(misc.getServerPath() + "\\accounts\\" + username + ".xml"); 
while (reader.Read()) 
{ 
    if (reader.NodeType == XmlNodeType.Element && reader.Name == "Friends") { 
     if (!reader.IsEmptyElement) //got any friends 
     { 
      while (reader.ReadToFollowing("Friend")) 
       //do_stuff_with_that_data(reader.ReadElementContentAsLong()); 
     } 
    } else if (reader.NodeType == XmlNodeType.Element && reader.Name == "Ignores") { 
     if (!reader.IsEmptyElement) //got any ignores 
     { 
      reader.ReadToFollowing("Ignore"); 
      while (reader.ReadToNextSibling("Ignore")) 
      { 
       //do_stuff_with_that_data(reader.ReadElementContentAsLong()); 
      } 
     } 
    } else if (reader.NodeType == XmlNodeType.Element && reader.Name == "InventoryItems") { 
     if (!reader.IsEmptyElement) //got items 
     { 
      int slot, id, amount; 
      while (reader.ReadToNextSibling("Item")) 
      { 
       reader.ReadToFollowing("Slot"); 
       slot = reader.ReadElementContentAsInt(); 
       reader.ReadToFollowing("Id"); 
       id = reader.ReadElementContentAsInt(); 
       reader.ReadToFollowing("Amount"); 
       amount = reader.ReadElementContentAsInt(); 
       //do_stuff_with_that_data(slot, id, amount); 
      } 
     } 
    } else if (reader.NodeType == XmlNodeType.Element && reader.Name == "BankItems") { 
     if (!reader.IsEmptyElement) //got bank items 
     { 
      int slot, id, amount; 
      while (reader.ReadToNextSibling("Item")) 
      { 
       reader.ReadToFollowing("Slot"); 
       slot = reader.ReadElementContentAsInt(); 
       reader.ReadToFollowing("Id"); 
       id = reader.ReadElementContentAsInt(); 
       reader.ReadToFollowing("Amount"); 
       amount = reader.ReadElementContentAsInt(); 
       //do_stuff_with_that_data(slot, id, amount); 
      } 
     } 
    } 

回答

7

所以應該沒有理由進行切換。

有一個很好的理由來切換到DOM風格的代表,除非你的文件過大而合理地適合在內存:它更容易與表示工作。

XmlReader坦率地說是一種使用的痛苦。目前尚不清楚究竟發生了什麼問題(你說它「似乎無處不在」,但不完全是這樣),但我會強烈建議你轉向一個更簡單的模型。之後你的代碼將變得相當簡單。如果你可以可能使用LINQ to XML而不是3.5之前的API,那會讓你的生活更加美好。

如果你絕對堅持關於使用XmlReader,我建議你用更簡單的XML和代碼來演示這個問題。我還建議你重構你的代碼,以測試節點類型一次,然後將「處理元素」部分重構爲一個單獨的方法...在那裏你可能想要打開元素在一個單獨的方法中命名和處理每種元素。較小的方法通常更易於理解,測試和調試。

+1

如果您需要最高性能或者文檔太大而無法放入RAM,XmlReader是非常棒的。對於我推薦使用LINQ to XML的其他東西 - 我已經能夠用更簡潔的<50行LINQ to XML查詢替換> 200行XmlReader解析器。這是非常值得的! –