1

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

4

4 回答 4

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);
于 2012-10-10T09:56:02.170 回答
0

好的,所以我已经设法解决了这个问题。我不知道为什么,但它奏效了。似乎 Descendants 函数返回 null 作为独立函数,但使用 linq 它可以工作。所以对于我的解决方案,唯一应该做的是:

 var updateData = (from s in configXml.Descendants("Design") 
                   where s.Attribute("name").Value == design.DesignName 
                  select s).First();

起初,在我向您发送我的问题之前,我已经尝试过这个,但我没有 select 部分。此外,当我在大括号中写入 where s.Atribute 部分时,我插入了 design.DesignName 对象而不是属性名称。所以不,它工作正常。感谢您的帮助和一切。直到下一次。大家有一个美好的白天/黑夜:)

于 2012-10-16T13:58:52.427 回答
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
}
于 2012-10-10T09:31:52.570 回答
0

因为 DesignConfiguration 是您的根节点,所以 Descendants("DesignConfiguration) 返回 null。通过使用 .Descendants("Design"),您查看的是子节点,而不是自身。

于 2012-10-16T15:11:06.583 回答