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);

updateDatavaribaleでnullデータを取得しています。QuickWatchを介してDescendatの関数を試していると、null値も返されます。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 に答える