将信息添加到xml文件

时间:2014-07-07 14:10:20

标签: c# xml

我有一个XML文件,其中包含大约850个XML节点。像这样:

<NameValueItem>
   <Text>Test</Text>
   <Code>Test</Code>
</NameValueItem>

........ 849 more

我想在每个Node中添加一个新的Childnode。所以我最终这样:

    <NameValueItem>
       <Text>Test</Text>
       <Code>Test</Code>
       <Description>TestDescription</Description>
    </NameValueItem>

........ 849 more

我尝试过以下方法:

XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
XmlNodeList nodes = doc.GetElementsByTagName("NameValueItem");

这给了我所有的节点,但是从这里开始就被卡住了(猜测我需要遍历所有节点并追加到每一个节点)任何例子?

3 个答案:

答案 0 :(得分:1)

您需要以下示例中的内容。在每个节点上,您需要创建一个要添加到其中的新元素。我假设您将获得InnerText属性的不同值,但我只是使用了您的示例。

foreach (var rootNode in nodes)
{
    XmlElement element = doc.CreateElement("Description");
    element.InnerText = "TestDescription";
    root.AppendChild(element);
}

答案 1 :(得分:1)

您应该只能在XmlNodeList上使用foreach循环并将节点插入每个XmlNode:

foreach(XmlNode node in nodes)
{
    node.AppendChild(new XmlNode()
                         {
                              Name = "Description",
                              Value = [value to insert]
                         });
 }

这也可以通过使用LINQ to XML的XDocument来完成:

XDocument doc = XDocument.Load(xmlDoc);
var updated = doc.Elements("NameValueItem").Select(n => n.Add(new XElement() { Name = "Description", Value = [newvalue]}));
doc.ReplaceWith(updated);

答案 2 :(得分:0)

如果您不想使用适当的类(即XDocument)解析XML,可以使用Regex找到插入标记并插入标记的位置:

        string s = @"<NameValueItem>
                        <Text>Test</Text>
                        <Code>Test</Code>
                    </NameValueItem>";

        string newTag = "<Description>TestDescription</Description>";
        string result = Regex.Replace(s, @"(?<=</Code>)", Environment.NewLine + newTag);

但最好的解决方案是Linq2XML(它比简单的XmlDocument要好得多,现在已弃用)。

        string s = @"<root>
<NameValueItem>
   <Text>Test</Text>
   <Code>Test</Code>
</NameValueItem>
<NameValueItem>
   <Text>Test2</Text>
   <Code>Test2</Code>
</NameValueItem>
</root>";

        var doc = XDocument.Load(new StringReader(s));
        var elms = doc.Descendants("NameValueItem");
        foreach (var element in elms)
        {
            element.Add(new XElement("Description", "TestDescription"));
        }

        var text = new StringWriter();
        doc.Save(text);
        Console.WriteLine(text);