Divide o documento XML, criando vários arquivos de saída a partir de elementos repetidos
Eu preciso pegar um arquivo XML e criar vários arquivos xml de saída dos nós de repetição do arquivo de entrada. O arquivo de origem "AnimalBatch.xml" se parece com isto:
<?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>
O programa precisa dividir o "Animal" repetitivo e produzir 3 arquivos chamados: Animal_1001.xml, Animal_1002.xml e Animal_1003.xml
Cada arquivo de saída deve conter apenas seu respectivo elemento (que será a raiz). O atributo id de AnimalsBatch.xml fornecerá o número de seqüência para os nomes de arquivos Animal_xxxx.xml. O atributo id não precisa estar nos arquivos de saída.
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>
Eu quero fazer isso com XmlDocument, uma vez que precisa ser capaz de rodar em .net 2.0.
Meu programa é assim:
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();
}
Eu acho que tenho 2 problemas.
A) Depois de fazer o ImportNode no nó n em outdoc, eu chamo outdoc.AppendChild (n) que reclama: "O nó a ser inserido é de um contexto de documento diferente." Eu não sei se isso é um problema de escopo referenciando o nó n dentro do loop ForEach - ou se eu não estou usando de alguma forma o ImportNode () ou AppendChild corretamente. O segundo argumento em ImportNode () está definido como true, porque eu quero que os elementos filhos de Animal (3 campos arbitrariamente chamados Quantity, Adjective e Name) terminem no arquivo de destino.
B) O segundo problema é colocar o elemento Animal no outdoc. Estou recebendo "mas preciso" para poder colocar o nó n dentro dele. Eu acho que o meu problema é como eu estou fazendo: outdoc.AppendChild (rootnode);
Para mostrar o xml, estou fazendo: outdoc.Save (Console.Out); Eu tenho o código para salvar () para um arquivo de saída - o que funciona, desde que eu possa montar o outdoc adequadamente.
Há uma pergunta semelhante em:Dividir XML em vários arquivos XML, mas ainda não entendi o código da solução. Eu acho que estou muito perto desta abordagem e apreciarei qualquer ajuda que você possa fornecer.
Eu vou estar fazendo essa mesma tarefa usando XmlReader, uma vez que eu vou precisar lidar com grandes arquivos de entrada, e eu entendo que o XmlDocument lê tudo e pode causar problemas de memória.