2010-11-27 8 views
0

existieren Ich habe ein XML-Schema, das wie folgt aussieht:(Linq To) XML alle Elemente in Pfad hinzufügen, die nicht

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

InnerNodeType1 und InnerNodeType2 kann wie verschachtelt werden:

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

Was hält immer:

  • Es mindestens eine InnerNodeType1 im Weg ist
  • Es gibt mindestens eine InnerNodeType2 im Pfad
  • InnerNodeType2 man hat und nur eine LeafNode
  • Es gibt nur 2 Arten von innernodes

Grundsätzlich ist ein Pfad wie: InnerNodeType1\...\InnerNodeType1\InnerNodeType2\...\InnerNodeType2\Leaf.

Gegeben 3 Strings enthalten: Pfad für InnerNodeType1, Pfad für InnerNodeType2 und das Blatt, ich möchte in der XML-Datei die Elemente hinzufügen, die fehlen. Wenn ein Teil des Pfads bereits vorhanden ist, fügen Sie einfach neue Elemente als untergeordnete Knoten hinzu.

Wie kann ich dies mit C# und (Linq to) XML tun?

Dank

Antwort

1

Wollen Sie einfach Elementknoten im Pfad (e) gegeben hinzufügen? Wenn ich Sie richtig verstehe, dann können Sie das tun, wie folgt:

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

, dass die folgenden XML-Ausgänge:

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

, die in keiner Weise prüfen, ob die Bedingungen auf den Namen und die Anzahl bestimmter Elemente ist gewährleistet, es fügt einfach hinzu, was nicht da ist.