c# - Convert XDocument to byte array (and byte array to XDocument) -


i've taken on system stores large xml documents in sql server in binary format.

currently data saved converting string, converting string byte array. large xml documents i'm getting out memory exceptions when attempting convert string, want bypass process , go straight xdocument byte array.

the entity framework class holding xml has been extended binary data accessible string this:

partial class xmldata {     public string xmlstring { { return encoding.utf8.getstring(xmlbinary); } set { xmlbinary = encoding.utf8.getbytes(value); } } } 

i want further extend class this:

partial class xmldata {     public string xmlstring{ { return encoding.utf8.getstring(xmlbinary); } set { xmlbinary = encoding.utf8.getbytes(value); } }      public xdocument xdoc     {                 {             // convert xmlbinary xdocument         }         set         {             // convert xdocument xmlbinary         }     } } 

i think i've figured out conversion, when use partial classes xmlstring method xml db, xml has been cut off near end, @ different character count:

var memorystream = new memorystream(); var xmlwriter = xmlwriter.create(memorystream); myxdocument.writeto(xmlwriter); xmldata.xmlbinary = memorystream.toarray(); 

solution

here's basic conversion:

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(); } 

but reason in process, weird non ascii characters added xml using previous xmlstring method load weird characters , xdocument.parse() break, new partial class looks this:

partial class xmldata {     public string xmlstring      {                   {             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     {                 {             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();             }         }     } } 

that sounds buffer of 1 of streams / writers not flushed during read or write - use using (...) autoclose, flush , dispose, , check in places finished read / write you've done .flush()


Comments

Popular posts from this blog

database - VFP Grid + SQL server 2008 - grid not showing correctly -

jquery - Set jPicker field to empty value -

.htaccess - htaccess convert request to clean url and add slash at the end of the url -