Amol_B Ответов: 2

Разделить XML-файл на основе количества элементов


Привет,


у меня есть большой XML-файл,который я хочу разделить на несколько файлов в зависимости от количества элементов
Например, если файл выглядит следующим образом

<bookstore>
    <book category="...">
        <title >...</title>
        <author>...</author>
        <year>...</year>
        <price>...</price>
    </book>
    <book category="...">
        <title >...</title>
        <author>...</author>
        <year>...</year>
        <price>...</price>
    </book>
    <book category="...">
        <title >...</title>
        <author>...</author>
        <year>...</year>
        <price>...</price>
    </book>
    <book category="...">
        <title >...</title>
        <author>...</author>
        <year>...</year>
        <price>...</price>
    </book>
</bookstore>


каждый файл должен содержать только 2 книги, поэтому он должен генерировать два файлы, как показано ниже
<bookstore>
    <book category="...">
        <title >...</title>
        <author>...</author>
        <year>...</year>
        <price>...</price>
    </book>
    <book category="...">
        <title >...</title>
        <author>...</author>
        <year>...</year>
        <price>...</price>
    </book>
</bookstore>



Есть идеи?

2 Ответов

Рейтинг:
5

Amol_B

я сделал это таким образом

//New xml document object
                XmlDocument newXmlDoc = new XmlDocument();
                //XML writer to be used
                XmlTextWriter Xwr ;
//Read Root Element from XML
                XmlElement root = Doc.DocumentElement;

                //node nae to load nodes list
                if (Doc.DocumentElement.ChildNodes.Count > 0)
                    RootNodeName = "//" + root.Name + "/" + Doc.DocumentElement.ChildNodes[0].Name;
                else
                    RootNodeName = "//" + root.Name;

                //load all client noded in Node List
                XmlNodeList NodeList = Doc.SelectNodes(RootNodeName);
              

                //crete new doc and write empty root node
                XmlNode CurrentNode = null;
                XmlNode RootNode = newXmlDoc.CreateElement(root.Name);
                newXmlDoc.AppendChild(RootNode);


                for (int i = 0; i < NodeList.Count; i++)
                {
                    CurrentNode = NodeList[i];

                    //to skip empty nodes
                    if (CurrentNode.InnerXml == null || CurrentNode.InnerXml.Trim() == "")
                        continue;

                    //append nodes till batch size is reached
                    if (RecCount < iBatchSize)
                    {
                        XmlNode targetNode = newXmlDoc.ImportNode(CurrentNode, true);
                        RootNode.AppendChild(targetNode);
                        RecCount = RecCount + 1;
                    }
                    else
                    {
                        //once batch size is reached, save file and re-initialise xml document
                        FileCount = FileCount + 1;
                        Xwr = new XmlTextWriter(FilePath + @"\" + FileName + "_" + FileCount.ToString() + ".xml", Encoding.UTF8);
                        Xwr.Formatting = Formatting.None;
                        newXmlDoc.Save(Xwr);
                        Xwr.Close();
                        Xwr = null;
                        newXmlDoc = null;

                        newXmlDoc = new XmlDocument();
                        RootNode = newXmlDoc.CreateElement(root.Name);
                        newXmlDoc.AppendChild(RootNode);
                        XmlNode targetNode = newXmlDoc.ImportNode(CurrentNode, true);
                        RootNode.AppendChild(targetNode);
                        RecCount = 1;
                    }
                    if (i == NodeList.Count - 1)
                    {
                        if (RecCount > 0)
                        {
                            //if remaining items are less than Batchsize, save file at last
                            FileCount = FileCount + 1;
                            Xwr = new XmlTextWriter(FilePath + @"\" + FileName + "_" + FileCount.ToString() + ".xml", Encoding.UTF8);
                            Xwr.Formatting = Formatting.None;
                            newXmlDoc.Save(Xwr);
                            Xwr.Close();
                            Xwr = null;
                            Console.WriteLine();
                            newXmlDoc = null;
                        }
                    }

                }


Member 13475091

Не могли бы вы опубликовать декларационную часть кода, пожалуйста.Мне нужно разделить XML-файл объемом 4 ГБ.

Спасибо

Рейтинг:
17