0

xmlドキュメントを更新したいのですが、更新されたxmlを文字列で返す必要があります。私は以下のようにしようとしています。ドキュメントを保存すると、ファイル名が必要になります。しかし、私はこれをファイルとして保存したくありません。更新されたxmlを文字列で取得したいだけです。

        string OldXml = @"<Root>
                                  <Childs>
                                    <first>this is first</first>
                                    <second>this is second </second>
                                  </Childs        
                                  </Root>";

        XmlDocument NewXml = new XmlDocument();
        NewXml.LoadXml(OldXml );

        XmlNode root = NewXml.DocumentElement;
        XmlNodeList allnodes = root.SelectNodes("*");

        foreach (XmlNode eachnode in allnodes)
        {
            if (eachnode.Name == "first")
            {
                eachnode.InnerText = "1";
            }
        }

        NewXml.Save();
        string newxml = NewXml.OuterXml;
4

2 に答える 2

1

Save method文字列は不変であるため、呼び出す必要はありません。問題はにありますroot.SelectNodes("*")。すべてのレベルのノードではなく、子ノードを取得するだけです。もう1つのレベルに進む必要があります:

  foreach (XmlNode eachnode in allnodes)
        {
            var firstNode = eachnode.ChildNodes.Cast<XmlNode>()
                              .SingleOrDefault(node => node.Name == "first");
            if (firstNode != null)
            {
                firstNode.InnerText = "1";
            }
        }


  string newxml = NewXml.OuterXml;

LINQtoXMLを使用することを強くお勧めします。より簡単です。

var xDoc = XDocument.Parse(OldXml);
foreach (var element in xDoc.Descendants("first"))
    element.SetValue(1);

string newXml = xDoc.ToString();
于 2012-10-15T09:20:33.340 に答える
0

反復が「最初」と呼ばれるノードに到達することはありません。それ以外の場合は、を保存しなくても正常に機能しNewXmlます。

ただし、aを使用してXElement、すべての子孫を反復処理することはできます。

   string OldXml = @"<Root>
                      <Childs>
                      <first>this is first</first>
                      <second>this is second </second>
                      </Childs>        
                      </Root>";

            var NewXml = XElement.Parse(OldXml);
            foreach (var node in NewXml.Descendants())
            {
                if (node.Name.LocalName == "first")
                {
                    node.Value = "1";
                }
            }
            var reader = NewXml.CreateReader();
            reader.MoveToContent();
            string newxml = reader.ReadInnerXml();
于 2012-10-15T09:24:17.543 に答える