(Linq To)XML添加路径中不存在的所有元素

时间:2010-11-27 10:35:46

标签: c# xml linq-to-xml

我有一个XML模式,如下所示:

<InnerNodeType1 Name="...">
 <InnerNodeType2 Name="...">
  <Leaf ID="..." />
 </InnerNodeType2>
</InnerNodeType1>

InnerNodeType1InnerNodeType2可以嵌套为:

<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?

由于

1 个答案:

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

这绝不会检查名称和某些元素的数量是否得到确保,只是添加了不存在的内容。