我将 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/