2014-04-28 66 views
0

這可能相當小巧,但我遇到的問題很簡單。這是我的xml:C#XmlReader,序列問題

<CustomFieldOptions> 
<DataType>Text</DataType> 
<Options> 
    <Option Key="Advokater">category_advokater</Option> 
    <Option Key="Arkitektur- &amp; ingeniørvirksomheder">category_arkitektur</Option> 
    <Option Key="Bank &amp; finans">category_bank</Option> 
</Options> 

我試圖讓節點值和關鍵屬性的列表,如:

using (XmlReader reader = XmlReader.Create(new StringReader(xml))) 
     { 
      while(reader.Read()) 
      { 
       reader.ReadToFollowing("Option"); 
       key = reader.ReadInnerXml(); 
       reader.MoveToFirstAttribute(); 
       value = reader.Value; 

       if(key.Length > 0 && value.Length > 0) 
        categoryList.Add(key, value); 
      } 
     } 

因此,對於第一種選擇,我應該得到鍵值對<「category_advokater」,「Advokater」>

但是,當添加到列表中我有當前/前一行的混合值。我哪裏錯了?

Thx提前!

/snedker

+0

你*有*使用XmlReader嗎?如果您可以使用LINQ to XML,它可能會讓您的生活變得更簡單。 –

+0

PS:也試過 while(reader.ReadToFollowing(「Option」)) 沒有運氣。 –

+1

嗨喬恩, 我可以做很多事情,使這項工作。解析外部xml,xpath ...等等。但現在我真的想讓這位讀者工作。只是因爲。 :-) –

回答

0

你可以做,使用LINQ to XML

var xmlDocument = XDocument.Load("path"); 

var options = xmlDocument.Descendants("Option") 
      .ToDictionary(x => (string)x, x => (string)x.Attribute("Key")); 
+1

感謝您的意見。必須承認它非常短! :) 關心/ Snedker –

+0

@MortenSnedker這是LINQ到XML的美麗:-) –

0

閱讀器是更快,讓你部分處理XML文件。

嘗試此代碼片段。 ReadInnerXml將讀指針提前到下一個元素。如果您不跳過while語句中的下一個閱讀,則最終會無意中跳過元素。

using (XmlReader reader = XmlReader.Create(new StringReader(text))) { 
bool skipRead = false; 
while (skipRead || reader.Read()) { 
    skipRead = false; 
    if (reader.NodeType == XmlNodeType.Element && reader.Name == "Option") { 
     string key = reader.GetAttribute("Key"); 
     string value = reader.ReadInnerXml(); 
     skipRead = true; 
     Console.WriteLine("{0}.{1}", key, value); 
    } 
} 
+0

精美的作品。我只是錯過了每一次閱讀實際上會執行讀者指針的移動。所以我錯過了一個節拍。 Thx。 –