LINQ异常,如果节点不存在

时间:2012-08-18 22:11:18

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

我正在尝试读取xml文件并将其写入数据模型中的实体。 Xml看起来像这样:

...
<item>
   <guid>123456-7890</guid>
   <enclosure type="image/jpeg" url="http://example.com"/>
</item>

有时整个机箱节点不存在,所以我在查询中使用let,但它中断了:

var items = from xmlitems in xElem2.Descendants("item")
            let node_enclosure = xmlitems.Element("enclosure")
            select new
            {
                 strImageUrl = node_enclosure == null ? "none" : node_enclosure.Attribute("url").Value,
                 strguid = xmlitems.Element("guid").Value,
            };

更新:然后我试图在Datacontext中保存xml的值。

using (var datacontext = new db_RBEntities1())
{
     foreach (var item in items)
     {
         try
         {                 
              xmltable = new RSSTable();
              xmltable.guid = item.guid;
              xmltable.imageurl= item.strImageUrl;            
              datacontext.RSSTable.AddObject(xmltable);
         }
         catch (EntitySqlException ex)
         {
         }
     }
     datacontext.SaveChanges();
}

你能帮我解决一下我的查询有什么问题吗? 谢谢你的建议!

问候

2 个答案:

答案 0 :(得分:3)

我不确定你的代码有什么问题,但是你可以把它改写成看起来更好看(恕我直言)。

如果某个元素可能存在或者可能不存在于您的文档中,并且您希望从该元素中获取某些元素,我发现通过该名称查询所有元素更容易(期望只有一个元素),将值投射到该值你想要(在这种情况下,url属性的值)并调用SingleOrDefault()。这样,您将获得您的值或默认值(在这种情况下为null)。

此外,使用强制转换来从元素或属性中读取值,这使得在尝试读取值时不太可能获得NullPointerException

var items =
    from item in doc.Descendants("item")
    let enclosureUrl = item.Elements("enclosure")
        .Select(enclosure => (string)enclosure.Attribute("url"))
        .SingleOrDefault()
    select new
    {
        Guid = (string)item.Element("guid"),
        Url = enclosureUrl ?? "none",
    };

答案 1 :(得分:0)

我尝试它的工作原理 xml文件

<?xml version="1.0" encoding="utf-8" ?>

<items>
  <item>
    <guid>123458-7890</guid>    
  </item>
  <item>
    <guid>123456-7890</guid>
    <enclosure type="image/jpeg" url="http://example.com"/>
  </item>
</items>

获取xelement的代码

XElement xElem2 = XElement.Load(@"C:\\XMLFile1.xml");
              var items = from xmlitems in xElem2.Descendants("item")
                          let node_enclosure = xmlitems.Element("enclosure")
                          select new
                          {
                              strImageUrl = node_enclosure == null ? "none" : node_enclosure.Attribute("url").Value,
                              strguid = xmlitems.Element("guid").Value
                          };