将XDocument转换为字节数组(并将字节数组转换为XDocument)
本文关键字:字节数 数组 字节 XDocument 转换 | 更新日期: 2023-09-27 18:09:20
我接管了一个在SQL Server中以二进制格式存储大型XML文档的系统。
当前保存数据的方式是先将其转换为字符串,然后再将该字符串转换为字节数组。但是最近对于一些大型XML文档,在尝试转换为字符串时,我遇到了内存异常,所以我想绕过这个过程,直接从XDocument转换为字节数组。
保存XML的实体框架类已经扩展,因此二进制数据可以像这样作为字符串访问:
partial class XmlData
{
public string XmlString { get { return Encoding.UTF8.GetString(XmlBinary); } set { XmlBinary = Encoding.UTF8.GetBytes(value); } }
}
我想进一步扩展这个类,使其看起来像这样:
partial class XmlData
{
public string XmlString{ get { return Encoding.UTF8.GetString(XmlBinary); } set { XmlBinary = Encoding.UTF8.GetBytes(value); } }
public XDocument XDoc
{
get
{
// Convert XmlBinary to XDocument
}
set
{
// Convert XDocument to XmlBinary
}
}
}
我想我几乎已经弄清楚了转换,但是当我使用部分类XmlString方法从DB获取XML时,XML总是在接近结束时被切断,总是在不同的字符计数:
var memoryStream = new MemoryStream();
var xmlWriter = XmlWriter.Create(memoryStream);
myXDocument.WriteTo(xmlWriter);
XmlData.XmlBinary = memoryStream.ToArray();
解决方案下面是基本的转换:
var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = Encoding.UTF8 };
using (var memoryStream = new MemoryStream())
using (var xmlWriter = XmlWriter.Create(memoryStream, settings))
{
myXDocument.WriteTo(xmlWriter);
xmlWriter.Flush();
XmlData.XmlBinary = memoryStream.ToArray();
}
但是由于某些原因,在这个过程中,一些奇怪的非ascii字符被添加到XML中所以使用我之前的XmlString方法会加载这些奇怪的字符xdocument。parse()会中断,所以我的新部分类看起来像这样:
partial class XmlData
{
public string XmlString
{
get
{
var xml = Encoding.UTF8.GetString(XmlBinary);
xml = Regex.Replace(xml, @"[^'u0000-'u007F]", string.Empty); // Removes non ascii characters
return xml;
}
set
{
value = Regex.Replace(value, @"[^'u0000-'u007F]", string.Empty); // Removes non ascii characters
XmlBinary = Encoding.UTF8.GetBytes(value);
}
}
public XDocument XDoc
{
get
{
using (var memoryStream = new MemoryStream(XmlBinary))
using (var xmlReader = XmlReader.Create(memoryStream))
{
var xml = XDocument.Load(xmlReader);
return xml;
}
}
set
{
var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = Encoding.UTF8 };
using (var memoryStream = new MemoryStream())
using (var xmlWriter = XmlWriter.Create(memoryStream, settings))
{
value.WriteTo(xmlWriter);
xmlWriter.Flush();
XmlBinary = memoryStream.ToArray();
}
}
}
}
这听起来像是流/写入器中的一个缓冲区在读取或写入期间没有刷新-使用using (...)
进行自动关闭,刷新和处置,并检查在所有完成读/写的地方您已经完成了.Flush()