2016-03-08 71 views
2

我有下面的XML字符串(XMLTEXT):無法讀取XML字符串的某些元素

<?xml version="1.0" encoding="utf-8" ?> 
<RateSheet> 
    <rate category="children" date="2016-04-21"> 
    <value>1.375</value> 
    </rate> 

    <rate category="music" date="2016-05-01"> 
    <value>2.475</value>         
    </rate> 
</RateSheet> 

我需要閱讀從XML以下信息:類別,日期UND值

我可以閱讀類別和日期 - 但我不能爲值讀取數據

我有這樣的代碼:

using (XmlReader reader= XmlReader.Create(new StringReader(XMLText))) 
{ 
    while (reader.ReadToFollowing("rate")) 
    { 

     Rate rate = new Rate(); 

     reader.MoveToFirstAttribute(); 
     rate.Category = reader.Value; //text of current Node : Catagory 

     //************************************************************************************* 

     reader.MoveToNextAttribute(); //text of current Node : Date 
     DateTime myDate; 

     if (DateTime.TryParse(reader.Value, out myDate))  
     { 
     rate.Date = myDate;         
     } 

     //************************************************************************************* 

     reader.ReadToFollowing("value"); //should be 1.375 or 2.475 - but is always empty ("") 

     Console.WriteLine("value Element=" + reader.Value); //test: reader.Value does not the data 


     decimal myValue;          

     if (Decimal.TryParse(reader.Value, out myValue)) 
     { 
      rate.Value = myValue; 
     } 
     else 
     { 
      rate.Value = -1; // this is what happens because reader.value == "" 
     } 

     //return collection with result 
     myRates.Add(rate); 



    } 
} 
+0

檢查:http://stackoverflow.com/a/2441694/2224701 –

回答

0

這裏是你的代碼失蹤。

reader.ReadToFollowing("value"); 

後,您需要添加以下行:

reader.Read(); 

之後,它 「reader.Value;」將返回<內的文本值>。 的或者代替LINQ或StreamReader的,你可以使用DOM和XPath:

XmlDocument doc = new XmlDocument(); 
doc.Load("file.xml"); 
List<Rate> rates = new List<Rate>(); 

XmlNodeList nodes = doc.SelectNodes("//rate"); 

foreach(XmlNode x in nodes) 
{ 
    Rate r = new Rate(); 
    r.Category = x.Attributes["category"].Value; 
    r.Date = DateTime.ParseExact(x.Attributes["date"].Value,"yyyy-MM-dd", null)x.Attributes["category"].Value; 
    r.Value = double.Parse(x.SelectSingleNode("./value").InnerText)); 
    rates.Add(r); 
} 
3

你可以做簡單的LinqXml

var myrates = doc.Descendants("rate") 
    .Select(r=> new Rate() { 
     Category = r.Attribute("category").Value, 
     Date = DateTime.ParseExact(r.Attribute("date").Value,"yyyy-MM-dd", null), 
     Value = double.Parse(r.Element("value").Value), 

    }).ToList(); 

工作Demo

0

我喜歡使用的XmlReader和LINQ的組合

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      string XMLText = File.ReadAllText(FILENAME); 
      List<Rate> myRates = new List<Rate>(); 

      using (XmlReader reader = XmlReader.Create(new StringReader(XMLText))) 
      { 
       while (!reader.EOF) 
       { 
        if (reader.Name != "rate") 
        { 
         reader.ReadToFollowing("rate"); 
        } 
        if(!reader.EOF) 
        { 
         XElement xRate = (XElement)XElement.ReadFrom(reader); 
         Rate rate = new Rate(); 

         rate.Category = xRate.Attribute("category").Value; //text of current Node : Catagory 

         DateTime myDate; 

         if (DateTime.TryParse(xRate.Attribute("date").Value, out myDate)) 
         { 
          rate.Date = myDate; 
         } 


         Console.WriteLine("value Element=" + xRate.Element("value").Value); //test: reader.Value does not the data 


         decimal myValue; 

         if (Decimal.TryParse(xRate.Element("value").Value, out myValue)) 
         { 
          rate.Value = myValue; 
         } 
         else 
         { 
          rate.Value = -1; // this is what happens because reader.value == "" 
         } 

         //return collection with result 
         myRates.Add(rate); 

        } 
       } 
      } 
     } 
     public class Rate 
     { 
      public DateTime Date { get; set; } 
      public decimal Value { get; set; } 
      public string Category { get; set; } 
     } 
    } 
}