2011-01-20 27 views
24

XML noob here! 所以我有一些XML数据:如何在.NET中读取XML?

<DataChunk> 
    <ResponseChunk> 
     <errors> 
      <error code=\"0\"> 
       Something happened here: Line 1, position 1. 
      </error> 
     </errors> 
    </ResponseChunk> 
</DataChunk> 

我怎么会得到“错误”在那里我能得到访问“错误代码”和下面的文字说明......的名单? 另外,我在c#中使用.net4.0 ...谢谢!

+1

我假设这样的:“<错误代码= \ ”0 \“> '是不是你的XML实际上样子?那些斜杠会打破它,这只是C#逃避你剪切和粘贴? – 2011-01-20 21:47:16

+0

@james是>。<我把xml加载到一个字符串中并且复制了heh – sringer 2011-01-20 22:01:06

回答

44

将XML加载到XmlDocument中,然后使用xpath查询来提取所需的数据。

例如

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

XmlNode errorNode = doc.DocumentElement.SelectSingleNode("/DataChunk/ResponseChunk/Errors/error"); 

string errorCode = errorNode.Attributes["code"].Value; 
string errorMessage = errorNode.InnerText; 

如果需要具有可以使用SelectNodes获取包含在那个XPath的所有元素的XmlNodeList多个错误元素XML潜力。例如:

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

XmlNodeList errorNodes = doc.DocumentElement.SelectNodes("/DataChunk/ResponseChunk/Errors/error"); 

foreach(XmlNode errorNode in errorNodes) 
{ 
    string errorCode = errorNode.Attributes["code"].Value; 
    string errorMessage = errorNode.InnerText; 
} 

选项2

如果您对XML格式的XML模式,你可以绑定的模式,以一个类(使用.NET xsd.exe工具)。一旦你有了,你可以将XML反序列化为一个对象,并使用该对象而不是原始XML。这本身就是一个完整的主题,所以如果你确实有这个模式,这是值得研究的。

23

您可以使用Linq to XML

var doc = XDocument.Parse(xml); 
var errors = from e in doc.Descendants("error") 
      select new 
      { 
       code = e.Attribute("code").Value, 
       msg = e.Value.Trim() 
      }; 

foreach (var e in errors) 
{ 
    // use e.code & e.msg 
} 

如果输入XML是非常大但是,它可能是更好的去通过文档与XMLReader

3
XmlReader xmlReader = XmlReader.Create(new StringReader(response)); 
     AmortizationCalculatorBE amortization = new AmortizationCalculatorBE(); 
List<PaymentCalculator> paymentList = new List<PaymentCalculator>(); 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(new StringReader(response)); 
     XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("response/amortizationschedule/payment"); 
     XmlNodeList nodeList2 = xmlDoc.DocumentElement.SelectNodes("response"); 
     foreach (XmlNode node in nodeList) 
     { 
      PaymentCalculator payment = new PaymentCalculator(); 
      payment.beginningbalance = node.SelectSingleNode("beginningbalance").InnerText; 
      payment.principal = node.SelectSingleNode("principal").InnerText; 
      payment.interest = node.SelectSingleNode("interest").InnerText; 
      paymentList.Add(payment); 

     } 
     amortization._PaymentCalculator = paymentList; 
     foreach (XmlNode node in nodeList2) 
     { 
      amortization.totalprincipal = node.SelectSingleNode("totalprincipal").InnerText; 
      amortization.totalinterest = node.SelectSingleNode("totalinterest").InnerText; 

     }