Convert .NET XSLT, is it really streaming?

I have XML from which I need to remove empty elements. I am trying to avoid using the DOM and trying to do this as threads. I have this code, but I'm not quite sure how correct and optimized it is.

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();

Is this a good way to do this?

+3
source share
2 answers

Yes, you use streams, but you lose one of the advantages of streams: do not load all XML input and output into memory immediately.

This is great for very small XML documents, but it can lead to very large memory usage for large documents.

, StringReader/StringWriter , XML . :

  • / XML, FileStreams.
  • /HTTP-, Stream, .

, XSLT ( ), , ( XSLT ). XSLT . ( FileStream) DLL " " assembly.GetManifestResourceStream().

+6

StringBuilder XSL? XSL , ?

,

string xslt =
    @"<?xml version=""1.0"" encoding=""UTF-8""?>" +
     "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" +
     "<xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes""/>" +
     "<xsl:template match=""*"">" +
     "<xsl:if test=""count(@*) > 0 or count(node()) > 0"">" +
     "<xsl:copy>" +
     "<xsl:apply-templates select=""@* | node()""/>" +
     "</xsl:copy>" +
     "</xsl:if>" +
     "</xsl:template>" +
     "<xsl:template match=""@* | text()"">" +
     "<xsl:copy/>" +
     "</xsl:template>" +
     "</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)));
xslTransform.Transform(xmlReader, xmlWriter);
xmlReader.Close();

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

, , use() xmlReader xmlWriter. , . ,

StringBuilder resultString = new StringBuilder();
using (XmlTextWriter xmlWriter = new XmlTextWriter(new StringWriter(resultString)))
{
    using (XmlTextReader xmlReader = new XmlTextReader(new StringReader(xmlString)))
    {
        System.Xml.Xsl.XslCompiledTransform xslTransform = new System.Xml.Xsl.XslCompiledTransform();
        xslTransform.Load(new XmlTextReader(new StringReader(xslt)));
        xslTransform.Transform(xmlReader, xmlWriter);
    }
}
+3

Source: https://habr.com/ru/post/1710270/


All Articles