c# - .NET XSLT 转换,这真的是流式传输吗?

标签 c# .net xslt stream

我有一个 XML,我需要从中删除空元素。我试图避免使用 DOM,并试图将其作为流来执行。我有这段代码,但我不完全确定它的正确性和优化程度。

StringBuilder xslt = new StringBuilder();
xslt.Append(@"<?xml version=""1.0"" encoding=""UTF-8""?>");
xslt.Append(@"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">");
xslt.Append(@"<xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes""/>");
xslt.Append(@"<xsl:template match=""*"">");
xslt.Append(@"<xsl:if test=""count(@*) > 0 or count(node()) > 0"">");
xslt.Append(@"<xsl:copy>");
xslt.Append(@"<xsl:apply-templates select=""@* | node()""/>");
xslt.Append(@"</xsl:copy>");
xslt.Append(@"</xsl:if>");
xslt.Append(@"</xsl:template>");
xslt.Append(@"<xsl:template match=""@* | text()"">");
xslt.Append(@"<xsl:copy/>");
xslt.Append(@"</xsl:template>");
xslt.Append(@"</xsl:stylesheet>");

StringBuilder resultString = new StringBuilder();
XmlTextWriter xmlWriter = new XmlTextWriter(new StringWriter(resultString));
XmlTextReader xmlReader = new XmlTextReader(new StringReader(xmlString));

System.Xml.Xsl.XslCompiledTransform xslTransform = new System.Xml.Xsl.XslCompiledTransform();
xslTransform.Load(new XmlTextReader(new StringReader(xslt.ToString())));
xslTransform.Transform(xmlReader, xmlWriter);
xmlReader.Close();

xmlWriter.Flush();
xmlWriter.Close();

这样做好吗?

最佳答案

是的,您正在使用流,但您正在失去流的好处之一:不会立即将整个 XML 输入和输出加载到内存中。

这对于非常小的 XML 文档来说非常好,但对于大型文档来说可能会导致非常高的内存使用率。

一种解决方案是避免使用 StringReader/StringWriter,而是根据应从何处读取和发送 XML 而使用适当的流实现。例如:

  • 如果您想与 XML 文件相互转换,请使用 FileStreams。
  • 如果您通过套接字/HTTP 连接发送,请使用您的连接对象提供的 Stream。

此外,从嵌入式字符串加载 XSLT 通常不是一个好主意(更难维护),但我认为这不会导致性能问题(除非 XSLT 真的很大)。为了更好的可维护性,我建议将 XSLT 存储在另一个文件中。该文件可以从文件系统(使用 FileStream)加载,也可以作为“嵌入式资源”存储在已编译的 DLL 文件中并使用 assembly.GetManifestResourceStream() 加载。 .

关于c# - .NET XSLT 转换,这真的是流式传输吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/982600/

相关文章:

c# - 在本地 SQL Server 存储表的缓存拷贝

C# - 以编程方式创建 SQL Server 表

java - JDOM Transformer - 不要收缩空元素

xslt - 获取您不知道名称的属性的值

c# - 使用 C# 在 Word 中插入符号

c# - 如何在 .NET Core 中重定向对程序集的探测?

c# - 无法获取托管类型的地址、获取其大小或声明指向托管类型的指针

c# - 为什么哈希表和字典不使用 Equals() 方法而不是 GetHashCode 在 .NET 中进行键比较?

c# - Newtonsoft.Json.JsonToken.StartConstructor token 的用途是什么?

xml - 使用 XSLT 创建基于双重条件的元素