我有一个方法,它使用XMLReader
(同时验证)循环XML文档来提取特定的信息。我还需要压缩整个XML文档,以准备将其存储在数据库中。我必须执行此操作的代码如下。 这是(将整个XmlReader
传递给StreamWriter.Write()
)以实现这一目标的适当/最有效的方式吗?我没有看到明确的方式使用while(validatingReader.Read())
循环来实现相同的结果。
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
}
}
}
答案 0 :(得分:0)
压缩部分看起来很好。 MemoryStream可能不是大型文档的最佳选择,但在更改之前检查您的方案的性能是否正常。
“提取特定元素”部分不会读取任何内容,因为读者只能转发,因此在执行该部分时已经读取了所有内容。您可能想要重新创建阅读器。
答案 1 :(得分:0)
供将来参考:
问题中的代码无法正常运行。将XmlReader
传递给StreamWriter
无效。最后我没有最终以这种方式将压缩与验证结合起来,所以我没有完全“正确”的代码来展示这个但是不想让问题悬空。