2010-11-27 15 views
0

を存在しないパス内のすべての要素を追加します。(LINQのへの)XML私はこのようなXMLスキーマを持っている

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

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

InnerNodeType1InnerNodeType2は次のように入れ子にすることができます

何が常に成り立つ:パス内の少なくとも1つのInnerNodeType1あり

  • はinnernodes

のわずか2種類が基本的にのようなパスがあります

  • InnerNodeType2は、唯一のLeafNode
  • を持ってパス内の少なくとも1つのInnerNodeType2があります。

    InnerNodeType1のパス、InnerNodeType2のパスとリーフ、XMLファイルに欠落している要素を追加します。パスの一部が既に存在する場合は、新しい要素を子ノードとして追加するだけです。

    C#と(Linq to)XMLを使用してこれを行うにはどうすればよいですか?

    ありがとう

  • 答えて

    1

    パスに指定された要素ノードを追加するだけですか?私が正しくあなたを理解していれば、以下のように、あなたはそれを行うことができます:決してない

    <root> 
        <cont1> 
        <cont2> 
         <leaf /> 
        </cont2> 
        <cont1> 
         <cont2> 
         <leaf /> 
         </cont2> 
         <cont1> 
         <cont1> 
          <cont2> 
          <cont2> 
           <leaf /> 
          </cont2> 
          </cont2> 
         </cont1> 
         </cont1> 
        </cont1> 
        </cont1> 
    </root> 
    

    は名の条件と一定の数かどうかを確認します。次のXMLを出力

    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)); 
        } 
    } 
    

    要素が確保されていれば、そこにない要素が追加されます。