使用Linq解析嵌套的XML属性

时间:2017-02-25 03:13:45

标签: c# xml linq

我是XML的新手,我需要解析.XML页面的这一部分:

<TEAMDATA>
<Team TriCode="BOU" ShortName="Bournemouth" LongName="AFC Bournemouth" OfficialName="AFC Bournemouth" ID="t91" Manager="Manager" Venue="Vitality Stadium"/>
<Team TriCode="ARS" ShortName="Arsenal" LongName="Arsenal" OfficialName="Arsenal" ID="t3" Manager="Manager" Venue="Emirates Stadium"/>
<Team TriCode="AVL" ShortName="Aston Villa" LongName="Aston Villa" OfficialName="Aston Villa" ID="t7" Manager="Caretaker Manager" Venue="Villa Park"/>
<Team TriCode="BUR" ShortName="Burnley" LongName="Burnley" OfficialName="Burnley" ID="t90" Manager="Manager" Venue="Turf Moor"/>

我的想法是打印每个团队的tricode,shortname和logname,例如:

BOU Bournemouth AFC Bournemouth
ARS Arsenal AFC Bournemouth
...

这是我的代码:

static void Main(string[] args)
    {
        string strURL = "http://MyURL.xml";
        XDocument xDoc;
        string title = "";

        xDoc = XDocument.Load(strURL);
        var TeamID = from r in xDoc.Descendants("TEAMDATA")

                     select new
                     {

                         TriCode = r.Attribute("TriCode").Value,
                         ShortName = r.Element("ShortName").Value,
                         LongName = r.Element("LongName").Value,
                     };

        foreach (var r in TeamID)
        {
            Console.WriteLine(r.TriCode + r.ShortName + r.LongName);
        }
    }

直到现在我收到了

  

NullReferenceException异常

选择新子句之后。我需要解析这些行?

1 个答案:

答案 0 :(得分:1)

这应该有效

 from r in xDoc.Descendants("Team")
                 select new
                 {

                     TriCode = r.Attribute("TriCode").Value,
                     ShortName = r.Attribute("ShortName").Value,
                     LongName = r.Attribute("LongName").Value,
                 };

您的代码有什么问题?

xDoc.Descendants("TEAMDATA")会返回元素名称为TEAMDATA的所有后代,并且该元素没有您要查找的任何属性。

r.Element("ShortName").Value这一定是个错字。你想要的是属性值,但不是元素本身。