最近碰到如下问题我写的程序会从其它程序那儿接收到一个MemoryStream,注意是一次接收到的没法分步读取。
这个Stream大约在700M左右。里面的内容是几个Xml文件的内容拼在一起
像这样:
<xml1>
<app>hehe</app>
</xml1>
<xm2>
<app>haha</app>
</xml2>
因为这种规模的数据,你没法放到XmlDocument这样的对象中去处理,如果你这样做,会发现 System.OutOfMemeory
所以我想要用XmlTextReader将它读出来再存成小的Xml。在我读完</xml1>时,也就是第一个根节点读完,要读第二个根结点时,系统报异常(不能有mutiple root element)问题一:
我不知有没有什么方式,戓是其他什么类可以让我成功的读这种不规则的Xml,如果有的话问题可以解决。因为前述问题,我又想了其它解决办法给文档加一个root element,希望文档是这样
<data>
<xml1>
<app>hehe</app>
</xml1>
<xm2>
<app>haha</app>
</xml2>
</data>
这样的数据,XmlTextReader读起来就没问题了。
但是这个Stream太大,我不想把它转成字符串进行处理,我希望有一种方式可以在Stream有前面加一个StartElement
再在Stream的尾加一个EndElement,由于我这样写MemoryStream ms ;
StreamWriter sw = new StreamWriter(ms);
ms.Position = 0;
sw.WriteLine("<data>");
ms.Position = ms.Length -1;
sw.WriteLine("<data>");
ms.Position = 0;但是这样做好像是没有什么用,用XmlTextReader读它的时候,还是读不到我加上去的root element.问题二:
有没有什么方式可以给Stream做类似padding的动作,前面加一点,后面加一点
或者有没有什么方式让我构造一个新的Stream?构造的时候尽量不要copy,应为它实在太大了。
请各位帮忙想想,如果没有什么办法的话,我就要自己动手写解析xml的程序了:(

解决方案 »

  1.   

    to 这个Stream大约在700M左右。里面的内容是几个Xml文件的内容拼在一起问题一:
    我不知有没有什么方式,戓是其他什么类可以让我成功的读这种不规则的Xml,如果有的话问题可以解决。
    对于此的话,建议你把xml文件分开传送,否则后续的问题会更多。
      

  2.   

    to 问题二:
    有没有什么方式可以给Stream做类似padding的动作,前面加一点,后面加一点
    或者有没有什么方式让我构造一个新的Stream?构造的时候尽量不要copy,应为它实在太大了。直接修改stream是不可能的,你可以用临时文件的方式进行存取。
      

  3.   

    刚发上来,就解决了
    构造reader时,把它当成一个fragment,然后再指定一个类型就可以了
    reader = new XmlTextReader(ms,XmlNodeType.Element,null);
    这样就可以读像我的那种不规刚的xml了。爽了,thanks to Knight94(愚翁) all the same
    明天散分,来者都有份
      

  4.   

    Stream大约在700M放到Xml文档中,性能肯定很差。
      

  5.   

    如果是用XmlDocument的话,机器肯定是爆掉。