#region License and Copyright /* * Dotnet Commons Xml * * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place, * Suite 330, * Boston, * MA 02111-1307 * USA * */ #endregion using System; using System.Collections; using System.Collections.Specialized; using System.Diagnostics; using System.IO; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Xml; using System.Xml.Xsl; using System.Xml.Serialization; //using Dotnet.Commons.Reflection; namespace Dotnet.Commons.Xml { /// /// <summary> /// This utility class contains wrapper functions that help to ease the handling and /// manipulation of Xml documents, such as adding an element, adding an attribute /// to an element, copying and cloning of nodes, etc. /// /// </summary> /// public abstract class XmlUtils { /// ----------------------------------------------------------- /// <summary> /// Remove empty tags in the Xml string /// </summary> /// <param name="sXML"></param> /// <returns></returns> /// <remarks>Thanks to http://dotnet.editme.com/codeCleanXML</remarks> /// ----------------------------------------------------------- public static string RemoveEmptyTags(string sXML) { System.Text.StringBuilder sb = new StringBuilder(); sb.Append("<?xml version="1.0" encoding="UTF-8"?>"); sb.Append("<xsl:stylesheet "); sb.Append(" version="1.0" "); sb.Append(" xmlns:msxsl="urn:schemas-microsoft-com:xslt""); sb.Append(" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">"); sb.Append(" <xsl:output method="xml" version="1.0" encoding="UTF-8"/>"); sb.Append(" <!-- Whenever you match any node or any attribute -->"); sb.Append(" <xsl:template match="node()|@*">"); sb.Append(" <!-- Copy the current node -->"); sb.Append(" <xsl:if test="normalize-space(.) != '' or normalize-space(./@*) != '' ">"); sb.Append(" <xsl:copy>"); sb.Append(" <!-- Including any attributes it has and any child nodes -->"); sb.Append(" <xsl:apply-templates select="@*|node()"/>"); sb.Append(" </xsl:copy>"); sb.Append(" </xsl:if>"); sb.Append(" </xsl:template>"); sb.Append("</xsl:stylesheet>"); return transXMLStringThroughXSLTString(sXML, sb.ToString()); } private static string transXMLStringThroughXSLTString(string sXML, string sXSLT) { //This is the logic of the application. XslCompiledTransform objTransform = new XslCompiledTransform(); StringReader xmlStream = new StringReader(sXML); XmlReader xmlReader = new XmlTextReader(xmlStream); StringReader stream = new StringReader(sXSLT); XmlReader xmlReaderXslt = new XmlTextReader(stream); objTransform.Load(xmlReaderXslt, null, null); StringWriter objStream = new StringWriter(); objTransform.Transform(xmlReader, null, objStream); return objStream.ToString().Replace(@"encoding=""utf-16""?>", @"encoding=""utf-8""?>"); } } }