큰 XML 문서를 SQL Server에 이진 형식으로 저장하는 시스템을 인수했습니다.XDocument를 바이트 배열 (및 바이트 배열을 XDocument로 변환)
현재 데이터를 문자열로 변환 한 다음 해당 문자열을 바이트 배열로 변환하여 데이터를 저장합니다. 그러나 최근에 일부 대형 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 문자가 그래서 그로드 것입니다 내 이전 xmlString을 방법을 사용하여 XML에 추가됩니다 이상한 문자 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();
}
}
}
}
소리가납니다. 스트림/라이터 중 하나의 버퍼가 읽기 또는 쓰기 중에 플러시되지 않았습니다. -''(...) '를 사용하여 autoclose, flush 및 dispose를하고, 또한 읽기/쓰기를 마친 모든 장소에서' .Flush()' – Lanorkin
그게 다야! 가서 답을 추가하면 받아 들일 것입니다. – Owen