私は、特定の情報を抽出するXMLReader
(同時に検証する)を使用してXML文書をループするメソッドを持っています。また、をXML文書全体をデータベースに格納する準備として圧縮する必要があります。私がこれをしなければならないコードは以下の通りです。 (XmlReader
〜StreamWriter.Write()
)これを達成するための適切な/最も効率的な方法はありますか?while(validatingReader.Read())
ループを使用して同じ結果を得る明確な方法がわかりませんでした。XMLReader.Read()中にXMLを圧縮
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("schemaNamespace", "schemaLocation");
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.ValidationType = ValidationType.Schema;
readerSettings.Schemas.Add(schemaSet);
readerSettings.ValidationEventHandler
+= new ValidationEventHandler(XMLValidationError);
using (XmlReader documentReader = requestXML.CreateNavigator().ReadSubtree())
{
using (XmlReader validatingReader =
XmlReader.Create(documentReader, readerSettings))
{
using (MemoryStream output = new MemoryStream())
{
using (DeflateStream gzip =
new DeflateStream(output, CompressionMode.Compress))
{
using (StreamWriter writer =
new StreamWriter(gzip, System.Text.Encoding.UTF8))
{
writer.Write(validatingReader);
this.compressedXMLRequest
= Encoding.UTF8.GetString(output.ToArray());
}
}
}
while (validatingReader.Read())
{
// extract specific element contents
}
}
}
圧縮された結果は5Mb未満です。私はこれがMemoryStreamのために受け入れられると思いますか?特定のXML要素のコンテンツを抽出できる一方で、他のストリームにリーダーコンテンツを書き込む方法はありませんか? –
MemoryStreamは任意のサイズを扱うことができますが、問題が十分に速いかどうかです。問題は、MemoryStreamが大きくなって、以前のコンテンツを新しく割り当てられた配列にコピーする必要があることです。十分に速くない可能性があります。時間がかかると、大きな(〜1MB +)ストリームで測定可能です。 –
私は、同時に要素をストリーミングして抽出するために読者のコンテンツを書き込む簡単な方法を知らない。 –