c# – 如何添加流?

我正在将数据库中的blob作为字节数组加载,然后将它们放在内存流中,以便我可以将它们加载到xmldocument中进行解析.

但是,有blob具有多个根节点,这会导致解析器爆炸.

我的解决方案是创建一个包含整个blob的新根节点.

我可以使用一个编写器添加到最后但是我无法弄清楚如何添加到开头.

我如何预先添加到流?

更新
让这个工作起来我太麻烦了.我提取的“XML”不是正确的XML,我不得不在XmlDocument加载之前添加越来越多的正则表达式来删除错误的XML.我最终使用HtmlAgilityPack来解析我的XML有效部分,并将这些部分放在他们自己的xml文档中.不是最好的解决方案,但它的工作原理.叹

最佳答案
由于您已经有来自DB的byte []数组,因此在数组之前和之后将更多字节写入内存流应该很容易:

// bytes from db
byte[] multipleNodes = Encoding.UTF8.GetBytes("<first>..</first><second>..</second><third>..</third>");

using (var ms = new MemoryStream())
{
    // write opening tag
    byte[] newRoot = Encoding.UTF8.GetBytes("<newRoot>");
    ms.Write(newRoot, 0, newRoot.Length);

    ms.Write(multipleNodes, 0, multipleNodes.Length);

    // write opening tag
    byte[] closeNewRoot = Encoding.UTF8.GetBytes("</newRoot>");
    ms.Write(closeNewRoot, 0, closeNewRoot.Length);

    // reset cursor position before pass it to xmldoc
    ms.Position = 0;

    var xml = new XmlDocument();
    xml.Load(ms);

    Console.WriteLine(xml.InnerXml);
}

但是由于XmlDocument还提供了LoadXml(str),我觉得操纵字符串应该是更直接的解决方案:

// bytes from db
byte[] multipleNodes = Encoding.UTF8.GetBytes("<first>..</first><second>..</second><third>..</third>");

string stringFromBlob = Encoding.UTF8.GetString(multipleNodes);
string withRootNode = string.Format("<newRoot>{0}</newRoot>", stringFromBlob);

var xml = new XmlDocument();
xml.LoadXml(withRootNode);

Console.WriteLine(xml.InnerXml);

转载注明原文:c# – 如何添加流? - 代码日志