我有一个 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/