可以具有完全相同的子类的Xml类

时间:2012-07-20 16:49:01

标签: c# xml xml-parsing linq-to-xml xmlreader

我需要解析这个xml文档(仅部分):

<channel>
 <item>
   <title>a</title>
   <description>aa</description>
   <link url= "www.a.com" />
 </item>
<item>
   <title>b</title>
   <description>bb</description>
   <link url= "www.b.com" />
 </item>
<item>
   <title>c</title>
   <description>cc</description>
   <link url= "www.c.com" />
 </item>
<item>
   <title>d</title>
   <description>dd</description>
    <channelContents>
      <item>
         <title>a</title>
         <description>aa</description>
         <link url= "www.a.com" />
      </item>
      <item>
         <title>b</title>
         <description>bb</description>
         <link url= "www.b.com" />
      </item>
      <item>
         <title>c</title>
         <description>cc</description>
         <link url= "www.c.com" />
      </item>
    </channelContents>
 </item>
</channel>

这是我的代码:

List<ItemList> itemList = null;
reader = XmlReader.Create(new StringReader(content));
loadedData = XDocument.Load(reader);
var query = from i in loadedData.Descendants("item")
    select new ItemList
    {
        Title = (string)i.Element("title"),
        Description = (string)i.Element("description"),
        Link = (string)i.Element("link").Attribute("url").Value
    };
itemList = query.ToList();

每当我解析链接时,我都会收到错误。我想我找到了原因,这是因为标签<channelContents>。标题为“d”的项目具有在描述之后出现的标记,其中违反了<item>的模式。是否可以解析<channelContents>中的项目,因为它具有相同的项目(a,b和c)?

我收到了一个错误:

  

NullReferenceException,因为itemList为null。

我尝试删除Link = (string)i.Element("link").Attribute("url").Value,但确实有效。但我需要获得链接。

1 个答案:

答案 0 :(得分:0)

您的问题是第四项没有直接链接节点。

  var query = from i in loadedData.Descendants("item")
                        select new 
                        {
                            Title = (string)i.Element("title"),
                            Description = (string)i.Element("description"),
                            Link = (string)i.Descendants("link").FirstOrDefault().Attribute("url").Value
                        };

可能会做你想要的..返回7个节点.. a,b,c,d又一个a,b,c