gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:53:03 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com