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,因为 string 是不可变的,您的问题在于root.SelectNodes("*"),它只是获取子节点,而不是所有级别的节点。你需要再上一层:

  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;

强烈建议使用 LINQ to XML,它更简单:

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

您的迭代永远不会到达名为“first”的节点。否则它会在不保存NewXml.

但是,您可以使用 aXElement并遍历所有后代。

   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 回答