查询时linq更新与linq无法正常工作

时间:2012-10-10 09:27:11

标签: c# xml linq

我有问题我正在尝试使用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。我究竟做错了什么?

4 个答案:

答案 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。