c# - 我如何预先设置流?

标签 c# .net vb.net .net-3.5 stream

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

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

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

我可以使用 streamwriter 很好地添加到结尾,但是我不知道如何添加到开头。

如何添加到流中?


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

最佳答案

因为您已经从数据库中获得了 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# - 我如何预先设置流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8216369/

相关文章:

c# - Unity FixedJoint2D Bug

c# - 基于字符串选择多个属性的值

.net - Windows 工作流 - PersistableIdle

c++ - 如何在 .NET Visual Basic 应用程序中读取从 C++ DLL 返回的 const char*?

vb.net - 从 SSIS 上的脚本任务执行时,Oracle 过程不返回结果

c# - IEnumerator IEnumerable vb 到 C#

c# - 将父类动态转换为多个子类之一

c# - 如何在值为类列表的字典中添加项目?

mysql - 无法加载文件或程序集 'MySql.Data, Version=6.8.3.0"或其依赖项之一。该系统找不到指定的文件

c# - XmlSerializer + 抽象类 + 派生类 = 无用的命名空间