我有一个XML模式,如下所示:
<InnerNodeType1 Name="...">
<InnerNodeType2 Name="...">
<Leaf ID="..." />
</InnerNodeType2>
</InnerNodeType1>
InnerNodeType1
和InnerNodeType2
可以嵌套为:
<InnerNodeType1 Name="...">
<InnerNodeType1 Name="...">
<InnerNodeType1 Name="...">
<InnerNodeType2 Name="...">
<Leaf ID="..." />
</InnerNodeType2 Name="...">
</InnerNodeType1>
</InnerNodeType1>
</InnerNodeType1>
始终如一:
InnerNodeType1
InnerNodeType2
InnerNodeType2
只有一个LeafNode
基本上是一条路径:InnerNodeType1\...\InnerNodeType1\InnerNodeType2\...\InnerNodeType2\Leaf
。
给定3个字符串包含:InnerNodeType1的路径,InnerNodeType2的路径和叶子,我想在XML文件中添加缺少的元素。如果路径的某些部分已经存在,那么只需添加新元素作为子节点。
如何使用C#和(Linq to)XML?
由于
答案 0 :(得分:1)
您只是想添加路径中给出的元素节点吗?如果我理解正确,那么你可以这样做:
class Program
{
static void Main(string[] args)
{
XDocument doc = new XDocument();
Add(doc, @"root\cont1", "cont2", "leaf");
Add(doc.Root, @"cont1\cont1", "cont2", "leaf");
Add(doc.Root, "cont1", "cont2", "leaf");
Add(doc.Root, @"cont1\cont1\cont1\cont1", @"cont2\cont2", "leaf");
doc.Save(Console.Out);
}
static void Add(XContainer cont, string path1, string path2, string path3)
{
Add(cont, path1 + "\\" + path2 + "\\" + path3);
}
static void Add(XContainer cont, string path)
{
Add(cont, path.Split('\\'));
}
private static void Add(XContainer cont, IEnumerable<string> names)
{
XName name = names.FirstOrDefault();
if (name == null)
{
return;
}
XContainer child = cont.Element(name);
if (child == null)
{
child = new XElement(name);
cont.Add(child);
}
Add(child, names.Skip(1));
}
}
输出以下XML:
<root>
<cont1>
<cont2>
<leaf />
</cont2>
<cont1>
<cont2>
<leaf />
</cont2>
<cont1>
<cont1>
<cont2>
<cont2>
<leaf />
</cont2>
</cont2>
</cont1>
</cont1>
</cont1>
</cont1>
</root>
这绝不会检查名称和某些元素的数量是否得到确保,只是添加了不存在的内容。