在C#中使用XMLWriter创建大型xml

时间:2010-11-03 08:30:30

标签: c# xml

我正在尝试使用XMLWriter创建一个包含大数据的xml,该函数执行时没有任何异常。但是当我打开XML时,我发现创建的XML不完整,它在中途被破坏我不知道我做错了什么。是否有XMLWriter的默认大小限制? XMLWriter是创建大型XML的最佳方式吗?如果没有,请告诉我什么是创建大型xml的最佳方法?使用XDocument是否让我的生活更轻松?

这是我的代码结构(我不能把我的原始代码放在这里!! :()

using (//file stream)
{
     XmlWriter mywriter = new XmlWriter.Create(@"C:\mydata.xml");
       // write start element1
       // write start element2

                     while (//not end of file)
                    {
                    switch (entrytype)
                    {
                        Case 1:
                           // create elements
                        Case 2:
                           // create elements
                        so on ....
                    }
                    }

       // write end element2
       // write endelement1
}

XML的大小预计为几百KB。

请回复..

3 个答案:

答案 0 :(得分:5)

我怀疑你没有正确关闭写入:

using (//file stream)
{
     using(XmlWriter mywriter = new XmlWriter.Create(@"C:\Auditlog.xml")) {
       // write start element1
       // write start element2

                     while (//not end of file)
                    {
                    switch (entrytype)
                    {
                        Case 1:
                           // create elements
                        Case 2:
                           // create elements
                        so on ....
                    }
                    }

       // write end element2
       // write endelement1
    }
}

注意额外的using - 如果没有编写者可能仍有一些数据仍然被缓冲。这通常会导致数据缺少 end ;如果没有可重复的例子,我们就无法在中途诊断它。

另请注意:对于大型文件,xml将工作,但它不是必然最好的choce - 几百k应该没问题。

答案 1 :(得分:3)

XmlWriter正是用于创建大型XML文件的工具,大小限制将由基础流决定,在您的情况下是文件系统,因此只要您有可用空间就可以了

每次编写一个start元素时,都应确保提供相应的end元素,否则将抛出异常。您没有提供说明问题的代码的完整示例,因此无法确定是什么问题。

在构造函数中指定文件名时,也不需要使用文件流:

using (var writer = new XmlWriter.Create(@"C:\mydata.xml"))
{
    // TODO: use the writer here    
}

答案 2 :(得分:3)

using (//file stream)
{
     using(XmlWriter mywriter = new XmlWriter.Create(@"C:\Auditlog.xml")) {
       // write start element1
       // write start element2

                     while (//not end of file)
                    {
                    switch (entrytype)
                    {
                        Case 1:
                           // create elements
                        Case 2:
                           // create elements
                        so on ....
                    }
                    }

       // write end element2
       // write endelement1

       mywriter.Close();

    }
}

几百KB不是那么大!别担心! :)

此致

Mazhar Karimi