解析的XDocument

问题描述:

我试图解析这样的XML文件:解析的XDocument

<books> 
    <book> 
     <attr name="Moby Dick">Moby Dick is a classic</attr> 
     <attr isbn="isbnNumber">123456789</attr> 
    </book> 
</books> 

我怎样才能获得的“123456789”的价值?我并不需要第一个属性。

我试着在foreach循环中读取这些获取XElements,但我不断收到NULL对象异常。

foreach(XElement xe in XDoc.Attribute("attr")) 
{ 
    string str = xe.Attribute("isbnNumber").Value // NULL EXCEPTION HERE 
} 

在此先感谢...

+0

一个奇怪的XML ...你为什么要使这些属性'书'而不是' 2010-12-16 01:45:34

123456789实际上是一个元素的值,而不是属性。你想要什么可以做,像这样:

XElement attr = xDoc.Descendants("attr") 
        .FirstOrDefault(x=> 
         (string)x.Attribute("isbn") == "isbnNumber" 
        ); 

string isbn = (string)attr; 

你甚至可以使一个线,但如果你是新来的LINQ to XML,这可能是更容易阅读。

你可以尝试使用XPathSelectElement()扩展方法[你需要使用System.Xml.XPath来获取它们]。

E.g.

var isbn = xDoc.XPathSelectElement("//book/attr[@isbn='isbnNumber']").Value 

PS。一个很好的XPath测试器是:http://www.yetanotherchris.me/home/2010/6/7/online-xpath-tester.html

+0

我个人认为XPath可能是更好的解决方案。我从来没有对LINQ to XML方式留下过深刻的印象。 – Josh 2010-12-16 01:47:56

+0

我也是这样...... XPath使深层查询具有无限可读性,但它们也代表了维护开发人员掌握的另一种语法(特别是在执行复杂事务时)。虽然在这个例子中,它更清晰,并且在我看来很容易理解! – Reddog 2010-12-16 01:55:04

嗯,我无法弄清楚如何响应个人答案.....但我实现了他们两个,他们都工作。

我正在与Reddog的答案,因为它是一个更直接一点,是新的LINQ这是目前最容易阅读的可读性。

感谢您的回复!