1

我正在尝试读取 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();
}

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

问候

4

2 回答 2

3

我不确定您的代码有什么问题,但您可以将其重写为更好看(恕我直言)。

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

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

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",
    };
于 2012-08-18T22:33:09.923 回答
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
                          };
于 2012-08-18T22:39:31.427 回答