分裂XML文档除了重复的元素创建多个输出文件(Split XML document apart cr

2019-07-30 22:03发布

我需要一个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>
<Color>Blind</Color>
<Name>Mice</Name>
</Animal>
</Animals>

该程序需要拆分的重复“动物”,并产生3个文件名为:Animal_1001.xml,Animal_1002.xml和Animal_1003.xml

每个输出文件应该只包含其各自的元件(这将是根目录)。 从AnimalsBatch.xml id属性将提供的序列号为文件名Animal_xxxx.xml。 id属性并不需要在输出文件。


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>

我想与XmlDocument的做到这一点,因为它需要能够在NET 2.0运行。

我的计划是这样的:

    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();
    }

我想,我有2个问题。

A)做ImportNode上节点n到outdoc后,我请outdoc.AppendChild(N),其抱怨:“要插入的节点是从一个不同的文件中,” 我不知道这是一个范围问题引用节点n foreach循环中 - 或者,如果我有点不使用ImportNode()或使用appendChild正常。 在ImportNode第二个参数()设置为true,因为我想要动物的子元素(3场任意命名数量,形容词和名称)在目标文件结束。

B)第二个问题是获得动物元件成outdoc。 我得到“”,但我需要'这样我就可以把节点n里面。 我想我的问题是我过得怎么样:outdoc.AppendChild(根节点);

要显示XML,我做:outdoc.Save(Console.Out); 我有代码保存()到一个输出文件 - 这不工作,只要我能得到outdoc组装正常。

有一处类似的问题: 在多个XML文件拆分XML ,但我不明白的解决方案代码呢。 我觉得我非常接近这一做法,并感谢所有帮助您可以提供。

我将做使用的XmlReader完成相同的任务,因为我将需要能够处理大量输入文件,据我所知,在XmlDocument的读取整个事情,可能会导致内存问题。

Answer 1:

这是一个简单的方法,似乎你在找什么

public void test_xml_split()
{
    XmlDocument doc = new XmlDocument();
    doc.Load("C:\\animals.xml");
    XmlDocument newXmlDoc = null;

    foreach (XmlNode animalNode in doc.SelectNodes("//Animals/Animal"))
    {
        newXmlDoc = new XmlDocument();
        var targetNode = newXmlDoc.ImportNode(animalNode, true);
        newXmlDoc.AppendChild(targetNode);
        newXmlDoc.Save(Console.Out);
        Console.WriteLine();
    }
}


Answer 2:

这种做法似乎不使用“VAR targetnode”语句来工作。 它创建从foreach循环outdoc的“动物”元素称为targetNode的XmlNode对象。 我认为,在我原来的代码问题的主要事情是:A)我被错误地得到节点列表NL。 和b)我不能“导入”节点n,我想是因为它与文档相关的特别。 它有其自身的节点被创建。

与之前提出的解决方案的问题是使用“VAR”关键字。 我的程序必须假定2.0中随附V3.0。 我喜欢罗杰斯的解决方案,因为它是简洁。 对于我 - 我想做的每一件事情作为一个单独的声明。

    static void SplitXMLDocument() 
    {
        string strFileName;
        string strSeq;
        XmlDocument doc = new XmlDocument();             // The input file
        doc.Load("D:\\Rick\\Computer\\XML\\AnimalBatch.xml");
        XmlNodeList nl = doc.DocumentElement.SelectNodes("//Animals/Animal");

        foreach (XmlNode n in nl)
        {
            strSeq = n.Attributes["id"].Value;           // Animal nodes have an id attribute

            XmlDocument outdoc = new XmlDocument();      // Create the outdoc xml document
            XmlNode targetNode = outdoc.CreateElement("Animal"); // Create a separate node to hold the Animal element

            targetNode = outdoc.ImportNode(n, true);     // Bring over that Animal
            targetNode.Attributes.RemoveAll();           // Remove the id attribute in <Animal id="1001">

            outdoc.ImportNode(targetNode, true);         // place the node n into outdoc
            outdoc.AppendChild(targetNode);              // AppendChild to make it stick

            strFileName = "Animal_" + strSeq + ".xml";                
            outdoc.Save(Console.Out); Console.WriteLine();
            outdoc.Save("D:\\Rick\\Computer\\XML\\" + strFileName);
            Console.WriteLine();
        }
    }


文章来源: Split XML document apart creating multiple output files from repeating elements