【发布时间】:2012-10-10 09:27:10
【问题描述】:
我有一个问题,我正在尝试使用 linq 查询更新 XML 的特定部分,但它不起作用。所以我是一个 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<DesignConfiguration>
<Design name="CSF_Packages">
<SourceFolder>C:\CSF_Packages</SourceFolder>
<DestinationFolder>C:\Documents and Settings\xxx</DestinationFolder>
<CopyLookups>True</CopyLookups>
<CopyImages>False</CopyImages>
<ImageSourceFolder>None</ImageSourceFolder>
<ImageDesinationFolder>None</ImageDesinationFolder>
</Design>
</DesignConfiguration>
我想选择存在Design name="somethning"的部分并获取后代,然后更新表示该部分的后代值:
<SourceFolder>C:\CSF_Packages</SourceFolder>
<DestinationFolder>C:\Documents and Settings\xxx</DestinationFolder>
<CopyLookups>True</CopyLookups>
<CopyImages>False</CopyImages>
<ImageSourceFolder>None</ImageSourceFolder>
<ImageDesinationFolder>None</ImageDesinationFolder>
我有这个代码:
XDocument configXml = XDocument.Load(configXMLFileName);
var updateData = configXml.Descendants("DesignConfiguration").Elements().Where(el => el.Name == "Design" &&
el.Attribute("name").Value.Equals("CSF_Packages")).FirstOrDefault();
configXml.Save(configXMLFileName);
我在updateData 变量中获取空数据。当我通过 QuickWatch 尝试 Descendat 的功能时,它也返回一个空值。当我检查 configXML 变量时,它的数据就是我的整个 xml。我究竟做错了什么?
【问题讨论】:
-
你真的有一个元素的
name属性的值为“AFP_GRAFIKA”吗?在您的示例中,该属性的唯一值是“CSF_Packages”... -
是的,因为我正在测试一些东西,我给了你我正在尝试的东西的代码,对此感到抱歉。
-
没关系,您的示例一切正常,但我注意到如果您搜索“CSF_Packages”而不是“AFP_GRAFIKA”,您的代码会检索 XML,所以我认为可能是具有属性 @值为“AFP_GRAFIKA”的 987654327@ 的路径与
DesignConfiguration\Design不同。 -
我确实搜索过这个,但它仍然不起作用。问题是,无论我要求什么,后代函数都返回 null 。所以我猜当它为空时没有什么可以检索的。我将更新帖子,以免对此造成混淆:)