我有一个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");
这给了我所有的节点,但是从这里开始就被卡住了(猜测我需要遍历所有节点并追加到每一个节点)任何例子?
答案 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);