2012-07-03 77 views
0

我在C#中遇到了XMLReader問題。將XMLData保存爲使用XMLReader列表

我得到這個代碼:

private void countryXMLReader() 
     { 
      XmlTextReader reader = new XmlTextReader("expenses.xml"); 
      List<string> twentyFour = new List<string>(); 
      while (reader.Read()) 
      { 

       if (reader.Name.Equals("_24h")) 
       { 
        twentyFour.Add(reader.Value); 
       } 

       if (reader.Name == "_14h") 
       { 
        //MessageBox.Show(reader.Name); 
       } 


      } 
     } 

這是我的XML的文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<expenses> 
    <country> 
     <name>Germany</name> 
     <ID>D</ID> 
     <_24h>42</_24h> 
     <_14h>28</_14h> 
     <_8h>14</_8h> 
     <overnight>100</overnight> 
    </country> 
    <country> 
     <name>India</name> 
     <ID>IND</ID> 
      <_24h>30</_24h> 
      <_14h>20</_14h> 
      <_8h>10</_8h> 
      <overnight>120</overnight> 
    </country> 
</expenses> 

的listItems中被添加到列表中,但reader.Value總是空空的。

我該如何得到這個工作?

千恩萬謝

託比

編輯:

現在我得到了下面的代碼:

私人無效countryXMLReader(){ 名單 =二十四新名單();

 XDocument doc = XDocument.Load(@"C:\Users\Bl!tz\Documents\Visual Studio 2010\Projects\MBG.SimpleWizard\Demo\bin\Debug\expenses.xml"); 
     twentyFour.AddRange(doc 
          .Elements("expenses") 
          .Descendants("country") 
          .Descendants("_24h") 
          .Select(i => i.Value) 
          .ToList()); 
    } 

但它並沒有真正的價值。

什麼是我的問題?

EDIT2:

這是我的代碼使用方法:

private void countryXMLReader() 
     { 
      List<string> twentyFour = new List<string>(); 

      XDocument doc = XDocument.Load(@"expenses.xml"); 
      twentyFour.AddRange(doc 
           .Elements("expenses") 
           .Descendants("country") 
           .Descendants("name") 
           .Descendants("ID") 
           .Descendants("_24h") 
           .Descendants("_14h") 
           .Descendants("_8h") 
           .Descendants("overnight") 
           .Select(i => i.Value) 
           .ToList()); 
     } 

但List.Count保持爲0,我把這種方法是這樣的:

public Page1() 
     { 
      InitializeComponent(); 
      countryXMLReader(); 
     } 

我也用一個按鈕測試它,但結果相同

+0

嘗試的路徑設置爲@ 「expenses.xml」。並在Visual Studio中將文件expense.xml的「複製到輸出目錄」屬性設置爲「始終複製」(我假定您已將費用添加到項目中)。 –

+0

我已經設置了屬性並更改了路徑,但列表仍爲空 – user1414157

+0

它正在處理您提供的示例XML代碼,請確保文件中的XML與發佈的XML文件具有相同的結構。你可以把XML文件放在網頁上(如果它不包含任何敏感數據)? –

回答

0

嘗試使用XmlDocument和XPath表達式的代碼:

 string s = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><expenses> <country>  <name>Germany</name>  <ID>D</ID>  <_24h>42</_24h>  <_14h>28</_14h>  <_8h>14</_8h>  <overnight>100</overnight> </country> <country>  <name>India</name>  <ID>IND</ID>   <_24h>30</_24h>   <_14h>20</_14h>   <_8h>10</_8h>   <overnight>120</overnight></country></expenses>"; 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(s); 

     XmlNode rootNode = doc.SelectSingleNode(@"/expenses"); 
     var nodes24 = rootNode.SelectNodes(@"country/_24h"); 
     var nodes14 = rootNode.SelectNodes(@"country/_14h"); 

     List<string> twentyFour = new List<string>(); 
     twentyFour.AddRange(nodes24 
          .Cast<XmlNode>() 
          .Select(i => i.InnerText) 
          .ToArray()); 

您也可以嘗試哪些建議和新的XmlDocument相比,但需要NET版本高於3.0的System.Xml.Linq的做法:

 List<string> names = new List<string>(); 
     List<string> twentyFour = new List<string>(); 
     List<string> fourteen = new List<string>(); 

     XDocument doc = XDocument.Load(@"expenses.xml"); 

     var elements = doc 
      .Root 
      .Descendants("country"); 

     names.AddRange(elements 
          .Descendants("name") 
          .Select(i => i.Value) 
          .ToList()); 

     twentyFour.AddRange(elements 
          .Descendants("_24h") 
          .Select(i => i.Value) 
          .ToList()); 

     fourteen.AddRange(elements 
          .Descendants("_14h") 
          .Select(i => i.Value) 
          .ToList()); 

     // You can process each country element individually like this 
     foreach (XElement el in elements) 
     { 
      string name = el.Element("name").Value; 
      string _24h = el.Element("_24h").Value; 
      string _14h = el.Element("_14h").Value; 
     } 
+0

哪個更好?或者這些與其他選擇之間的區別在哪裏。這個XML文件只是我整個XML的片段。對不起,所以這將是一個非常長的字符串,我必須把我的代碼。 – user1414157

+0

我將XElement更改爲XDocument(XElement用於XML片段,而XDocument用於整個文檔)。這裏是XDocument和XmlDocument之間的區別答案:http://stackoverflow.com/questions/1542073/xdocument-or-xmldocument據此,XDocument是一個更好的方法(除非你使用NET版本3.0或更低版本,在這種情況下,XDocument不可用)。 –

+0

但我不能使用XDocument,因爲我必須將整個XML複製到一個字符串中。所以我必須更改字符串中的任意值而不是XML中的值。我有這個權利嗎? – user1414157

0

對於XmlReader使用給人一種元素含量字符串值ReadElementContentAsString()

代替

twentyFour.Add(reader.Value); 

使用

twentyFour.Add(reader.ReadElementContentAsString());