2010-11-27 21 views
0

我有一個看起來像這樣的XML架構:(LINQ To)的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
  • 只是有2種類型innernodes

的基本上是一樣的路徑:InnerNodeType1\...\InnerNodeType1\InnerNodeType2\...\InnerNodeType2\Leaf

給出3個字符串,包含:InnerNodeType1的路徑,InnerNodeType2的路徑和葉,我想在XML文件中添加缺少的元素。如果路徑的某些部分已經存在,那麼只需添加新元素作爲子節點。

我該如何使用C#和(Linq to)XML?

感謝

回答

1

你只是想添加路徑(S)給定的元素節點?如果我理解正確的話,那麼你可以做到這一點,如下所示:

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> 

這確實絲毫不檢查是否在名稱的條件和一定的數量元素是確保的,它只是增加了不存在的東西。