如何预先添加流?

Bif*_*iff 3 .net c# vb.net stream .net-3.5

我将 blob 作为字节数组从数据库中加载,并将它们放入内存流中,以便可以将它们加载到 xml 文档中进行解析。

然而,有些 blob 具有多个根节点,这会导致解析器崩溃。

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

我可以使用流编写器很好地添加到末尾,但是我不知道如何添加到开头。

如何添加到流之前?


更新
我在让它工作时遇到了太多麻烦。我提取的“XML”不是正确的 XML,我必须不断添加越来越多的正则表达式才能在 XmlDocument 加载之前删除错误的 XML。我最终使用 HtmlAgilityPack 解析出 XML 的有效部分,并将它们放入自己的 xml 文档中。这不是最好的解决方案,但它有效。

Gan*_*ant 5

由于您已经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);
}
Run Code Online (Sandbox Code Playgroud)

但既然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);
Run Code Online (Sandbox Code Playgroud)