我正在尝试读取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();
}
你能帮我解决一下我的查询有什么问题吗? 谢谢你的建议!
问候
答案 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
};