我需要获取一个非常大的 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”进行拆分,生成适当数量的文件,命名为: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。如果它没有“空白”(我没有,也不能那样得到),我会得到其他的(奇数动物)
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 属性的正确文件名下。
有人可以让我知道这里发生了什么 - 以及可能的解决方法吗?