非常に大きなXMLファイルを取得し、入力ファイルの何千もの繰り返しノードから複数の出力xmlファイルを作成する必要があります。ソースファイル「AnimalBatch.xml」には、次のような空白はありません。
<?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><Adjective>Blind</Adjective><Name>Mice</Name></Animal><Animal id="1004"><Quantity>Four</Quantity><Adjective>Purple</Adjective><Name>Horses</Name></Animal><Animal id="1005"><Quantity>Five</Quantity><Adjective>Long</Adjective><Name>Centipedes</Name></Animal><Animal id="1006"><Quantity>Six</Quantity><Adjective>Dark</Adjective><Name>Owls</Name></Animal></Animals>
プログラムは、繰り返される「動物」を分割し、Animal_1001.xml、Animal_1002.xml、Animal_1003.xmlなどの名前の適切な数のファイルを生成する必要があります。
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>
以下のコードは機能しますが、入力ファイルの<Animal id="xxxx">
要素の後にCR/LFがある場合に限ります。「空白」がない場合(私は空白がなく、そのように取得できません)、1つおきに取得します(奇数の動物)
static void SplitXMLReader()
{
string strFileName;
string strSeq = "";
XmlReader doc = XmlReader.Create("C:\\AnimalBatch.xml");
while (doc.Read())
{
if ( doc.Name == "Animal" && doc.NodeType == XmlNodeType.Element )
{
strSeq = doc.GetAttribute("id");
XmlDocument outdoc = new XmlDocument();
XmlDeclaration xmlDeclaration = outdoc.CreateXmlDeclaration("1.0", "utf-8", null);
XmlElement rootNode = outdoc.CreateElement(doc.Name);
rootNode.InnerXml = doc.ReadInnerXml();
// This seems to be advancing the cursor in doc too far.
outdoc.InsertBefore(xmlDeclaration, outdoc.DocumentElement);
outdoc.AppendChild(rootNode);
strFileName = "Animal_" + strSeq + ".xml";
outdoc.Save("C:\\" + strFileName);
}
}
}
私の理解では、XMLでの「空白」またはフォーマットはXmlReaderに違いはないはずですが、の後にCR / LFがある場合とない場合の両方でこれを試しました<Animal id="xxxx">
が、違いがあることを確認できます。CR / LFがある場合(おそらくスペースだけでも、次に試してみます)、各<Animal>
ノードが完全に処理され、id属性から取得した正しいファイル名で保存されます。
誰かがここで何が起こっているのか、そして可能な回避策を教えてもらえますか?