Bif*_*iff 3 .net c# vb.net stream .net-3.5
我将 blob 作为字节数组从数据库中加载,并将它们放入内存流中,以便可以将它们加载到 xml 文档中进行解析。
然而,有些 blob 具有多个根节点,这会导致解析器崩溃。
我的解决方案是创建一个包含整个 blob 的新根节点。
我可以使用流编写器很好地添加到末尾,但是我不知道如何添加到开头。
如何添加到流之前?
更新
我在让它工作时遇到了太多麻烦。我提取的“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);
}
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)
| 归档时间: |
|
| 查看次数: |
3459 次 |
| 最近记录: |