我有问题我正在尝试使用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
varibale中获取了空数据。当我通过QuickWatch尝试Descendat函数时,它也返回一个空值。当我检查configXML变量时,它的数据是我的整个xml。我究竟做错了什么?
答案 0 :(得分:0)
试试这个:
var updateData =
confixXml
.Root //Root Element
.Elements("Design") //All elements under root called Design
.Where(element => (String)element.Attribute("name") == "AFP_GRAFIKA") //Find the one with the name Attribute of AFP_GRAFIKA
.FirstOrDefault(); //Grab the first one it finds or return null.
if (updateData != null)
{
var myElements =
updateData
.Elements(); //All the elements under the Design node
}
答案 1 :(得分:0)
XDocument xml = XDocument.Load("");
XElement settings = (from children in xml.Descendants("DesignConfiguration")
where children.Name.Equals("Design") && children.Attribute("name").Equals("CSF_Packages")
select children).FirstOrDefault();
settings.Element("SourceFolder").SetValue("filepath");
settings.Element("CopyImages").SetValue(true);
答案 2 :(得分:0)
好的,所以我设法解决了这个问题。我不知道为什么但它有效。似乎Descendants函数返回null作为一个独立的函数,但是使用linq它可以工作。所以对于我的解决方案,唯一应该做的是:
var updateData = (from s in configXml.Descendants("Design")
where s.Attribute("name").Value == design.DesignName
select s).First();
在我向你发送我的问题之前,我已经尝试了这个但是我没有选择的部分。此外,当我在花括号中编写where s.Atribute部分时,我插入了design.DesignName对象而不是属性的名称。所以没有它工作正常。感谢您的帮助和一切。直到时间。每个人都有一个美好的一天/晚上:)
答案 3 :(得分:0)
因为DesignConfiguration是你的根节点,所以Descendants(“DesignConfiguration”)返回null。通过使用.Descendants(“Design”),你看的是子节点,而不是self。