Teilen Sie das XML-Dokument auf, indem Sie mehrere Ausgabedateien aus sich wiederholenden Elementen erstellen

Ich muss eine XML-Datei nehmen und mehrere Ausgabe-XML-Dateien von den sich wiederholenden Knoten der Eingabedatei erstellen. Die Quelldatei "AnimalBatch.xml" sieht folgendermaßen aus:

<?xml version="1.0" encoding="utf-8" ?>
<Animals>
<Animal id="1001">
<Quantity>One</Quantity>
<Adjective>Red</Adjective>
<Name>Rooster</Name>
</Animal>
<Animal id="1002">
<Quantity>Two</Quantity>
<Adjective>Stubborn</Adjective>
<Name>Donkeys</Name>
</Animal>
<Animal id="1003">
<Quantity>Three</Quantity>
<Color>Blind</Color>
<Name>Mice</Name>
</Animal>
</Animals>

Das Programm muss das sich wiederholende "Animal" aufteilen und 3 Dateien mit den Namen "Animal_1001.xml", "Animal_1002.xml" und "Animal_1003.xml" erstellen

Jede Ausgabedatei sollte nur das jeweilige Element enthalten (das der Stamm ist). Das id-Attribut aus AnimalsBatch.xml liefert die Sequenznummer für die Animal_xxxx.xml-Dateinamen. Das id-Attribut muss nicht in den Ausgabedateien enthalten sein.

Animal_1001.xml:
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>One</Quantity>
<Adjective>Red</Adjective>
<Name>Rooster</Name>
</Animal>

Animal_1002.xml
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>Two</Quantity>
<Adjective>Stubborn</Adjective>
<Name>Donkeys</Name>
</Animal>

Animal_1003.xml>
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>Three</Quantity>
<Adjective>Blind</Adjective>
<Name>Mice</Name>
</Animal>

Ich möchte dies mit XmlDocument tun, da es auf .Net 2.0 ausgeführt werden muss.

Mein Programm sieht so aus:

    static void Main(string[] args)
    {
        string strFileName;    
        string strSeq;                    

        XmlDocument doc = new XmlDocument(); 
        doc.Load("D:\\Rick\\Computer\\XML\\AnimalBatch.xml");

        XmlNodeList nl = doc.DocumentElement.SelectNodes("Animal");

        foreach (XmlNode n in nl)
        {
            strSeq = n.Attributes["id"].Value;

            XmlDocument outdoc = new XmlDocument();
            XmlNode rootnode = outdoc.CreateNode("element", "Animal", "");

            outdoc.AppendChild(rootnode); // Put the wrapper element into outdoc

            outdoc.ImportNode(n, true);   // place the node n into outdoc
            outdoc.AppendChild(n);        // This statement errors:
            // "The node to be inserted is from a different document context."

            strFileName = "Animal_" + strSeq + ".xml";

            outdoc.Save(Console.Out);
            Console.WriteLine();
        }
        Console.WriteLine("END OF PROGRAM:  Press <ENTER>");
        Console.ReadLine();
    }

Ich glaube ich habe 2 Probleme.

A) Nachdem ich den ImportNode auf Knoten n in outdoc ausgeführt habe, rufe ich outdoc.AppendChild (n) auf, das sich beschwert: "Der einzufügende Knoten stammt aus einem anderen Dokumentkontext." Ich weiß nicht, ob dies ein Bereichsproblem ist, das auf Knoten n in der ForEach-Schleife verweist, oder ob ich ImportNode () oder AppendChild nicht ordnungsgemäß verwende. Das zweite Argument von ImportNode () ist auf true gesetzt, da die untergeordneten Elemente von Animal (3 Felder mit den willkürlichen Bezeichnungen Quantity, Adjective und Name) in der Zieldatei landen sollen.

B) Das zweite Problem ist, das Animal-Element in den Outdoc-Modus zu bringen. Ich bekomme '', aber ich brauche '', damit ich Knoten n darin platzieren kann. Ich denke, mein Problem ist, wie ich mache: outdoc.AppendChild (rootnode);

Zum Anzeigen der XML-Datei mache ich Folgendes: outdoc.Save (Console.Out); Ich habe den Code, um () in einer Ausgabedatei zu speichern - was funktioniert, solange ich outdoc richtig zusammengestellt bekommen kann.

Es gibt eine ähnliche Frage bei:XML in mehrere XML-Dateien aufteilen, aber ich verstehe den Lösungscode noch nicht. Ich glaube, ich bin diesem Ansatz ziemlich nahe und würde mich über jede Hilfe freuen, die Sie leisten können.

Ich werde dieselbe Aufgabe mit XmlReader ausführen, da ich in der Lage sein muss, große Eingabedateien zu verarbeiten, und ich verstehe, dass XmlDocument das Ganze einliest und Speicherprobleme verursachen kann.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage