Rozdziel dokument XML, tworząc wiele plików wyjściowych z powtarzających się elementów
Muszę pobrać plik XML i utworzyć wiele wyjściowych plików xml z powtarzających się węzłów pliku wejściowego. Plik źródłowy „AnimalBatch.xml” wygląda tak:
<?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>
Program musi podzielić powtarzające się „zwierzę” i utworzyć 3 pliki o nazwach: Animal_1001.xml, Animal_1002.xml i Animal_1003.xml
Każdy plik wyjściowy powinien zawierać tylko odpowiedni element (który będzie rootem). Atrybut id z AnimalsBatch.xml poda numer kolejny dla nazw plików Animal_xxxx.xml. Atrybut id nie musi znajdować się w plikach wyjściowych.
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>
Chcę to zrobić za pomocą XmlDocument, ponieważ musi on być w stanie działać na .Net 2.0.
Mój program wygląda tak:
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();
}
Myślę, że mam 2 problemy.
A) Po wykonaniu polecenia ImportNode na węźle n w outdoc, wywołuję outdoc.AppendChild (n), który narzeka: „Wstawiony węzeł pochodzi z innego kontekstu dokumentu”. Nie wiem, czy jest to problem dotyczący zakresu w węźle n w pętli ForEach - czy też nie korzystam właściwie z ImportNode () lub AppendChild. Drugi argument w ImportNode () jest ustawiony na true, ponieważ chcę, aby elementy potomne Animal (3 pola arbitralnie nazwane Quantity, Adjective i Name) trafiły do pliku docelowego.
B) Drugi problem polega na umieszczeniu elementu Animal w Outdoc. Dostaję „ale potrzebuję”, więc mogę umieścić w nim węzeł n. Myślę, że moim problemem jest to, jak robię: outdoc.AppendChild (rootnode);
Aby pokazać xml, robię: outdoc.Save (Console.Out); Mam kod do zapisania () do pliku wyjściowego - który działa, o ile mogę poprawnie zainstalować outdoc.
Podobne pytanie dotyczy:Podziel XML w wielu plikach XML, ale nie rozumiem jeszcze kodu rozwiązania. Myślę, że jestem blisko tego podejścia i docenię każdą pomoc, jaką możesz zapewnić.
Będę robił to samo zadanie przy użyciu XmlReader, ponieważ będę potrzebował obsługiwać duże pliki wejściowe i rozumiem, że XmlDocument wczytuje całość i może powodować problemy z pamięcią.