-1

非常に大きな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属性から取得した正しいファイル名で保存されます。

誰かがここで何が起こっているのか、そして可能な回避策を教えてもらえますか?

4

2 に答える 2

0

はい、doc.readInnerXml()空白を使用する場合は重要です。

関数のドキュメントから。これは文字列を返します。もちろん、空白は重要です。内部テキストをxmlNodeとして使用する場合は、次のようなものを使用する必要があります

于 2012-08-30T01:00:51.757 に答える
0

ReadSubTree() メソッドの使用に関するガイダンスをありがとう:

このコードは、改行のない XML 入力ファイルに対して機能します。

    static void SplitXMLReaderSubTree()
    {
        string strFileName;
        string strSeq = "";
        XmlReader doc = XmlReader.Create("C:\\AnimalBatch.xml");

        while (!doc.EOF)
        {
            if ( doc.Name == "Animal"  && doc.NodeType == XmlNodeType.Element )
            {
                strSeq = doc.GetAttribute("id");
                XmlReader inner = doc.ReadSubtree();
                inner.Read();
                XmlDocument outdoc = new XmlDocument();
                XmlDeclaration xmlDeclaration = outdoc.CreateXmlDeclaration("1.0", "utf-8", null);
                XmlElement myElement;
                myElement = outdoc.CreateElement(doc.Name);
                myElement.InnerXml = inner.ReadInnerXml();
                inner.Close();
                myElement.Attributes.RemoveAll();
                outdoc.InsertBefore(xmlDeclaration, outdoc.DocumentElement);
                outdoc.ImportNode(myElement, true);
                outdoc.AppendChild(myElement);
                strFileName = "Animal_" + strSeq + ".xml";
                outdoc.Save("C:\\" + strFileName);                    
            }
            else
            {
                doc.Read();
            }
        }
于 2012-08-30T04:18:02.757 に答える