C# “最好的方法”;“固定”;用于xsl转换的格式错误的html

C# “最好的方法”;“固定”;用于xsl转换的格式错误的html,c#,.net,html,xslt,xslt-1.0,C#,.net,Html,Xslt,Xslt 1.0,我有一个输入xml文档,其中包含格式错误的html,该html已被xml编码。 i、 e.xml文档本身在技术上是有效的 现在,我将对xml应用xsl转换,该xml输出格式良好的xhtml5,但包含格式错误的html 错误html的示例: html片段中的html、head和body标记 字体标签 不匹配的引号 未闭合标签 没有匹配打开的额外关闭标记 按错误的顺序关闭标记(例如,text) 现在在我的情况下,我实际上并不关心html格式是否错误——我只关心我的结束标记是否与开始标记匹配,而不

我有一个输入xml文档,其中包含格式错误的html,该html已被xml编码。 i、 e.xml文档本身在技术上是有效的

现在,我将对xml应用xsl转换,该xml输出格式良好的xhtml5,但包含格式错误的html

错误html的示例:

  • html片段中的html、head和body标记
  • 字体标签
  • 不匹配的引号
  • 未闭合标签
  • 没有匹配打开的额外关闭标记
  • 按错误的顺序关闭标记(例如,
    text
现在在我的情况下,我实际上并不关心html格式是否错误——我只关心我的结束标记是否与开始标记匹配,而不管中间是什么

所以我的问题是-什么是最好的方法来解决这两个问题

  • 充分清理html,使其不会影响其他标记(最好是从转换本身内部)
  • 或者以某种方式标记一个closetag,以便兼容html5的浏览器将其识别为与特定的open tag相匹配,而不管两者之间可能存在什么讨厌的标记
  • 两个人。我一点也不知道。我有一些关于1的想法。例如调用外部工具,如tidy或使用.NET sgml解析器

    .NET xsl脚本(
    msxsl:script
    )是可以接受的,如果不需要的话

    示例来源:

    <xml>
      &lt;b&gt;&lt;u&gt;bad html&lt;/b&gt;&lt;/u&gt;
    <xml>
    
    
    bubad html/b/u
    
    示例输出:

    <div id="MyDiv">
      <b><u>bad html</b></u>
    </div> <!-- this /div absolutly must match the opening div regardless of what might be in the bad html -->
    
    
    糟糕的html
    
    还有哪些其他方法可用


    C#,VS2012,仅XSLT1.0使用第三方库是否可以接受?(在NuGet上提供)可能是解决无效HTML的部分方法,而且(根据网站)还支持XSLT。

    我选择使用sgml解析库并转换为有效的xml

    我去了心灵之触的图书馆:

    编译并添加到GAC后,我可以使用以下xsl:

    <msxsl:script language="C#" implements-prefix="myns">
      <msxsl:assembly name="SgmlReaderDll, Version=1.8.11.0, Culture=neutral, PublicKeyToken=46b2db9ca481831b"/>
        <![CDATA[
     public XPathNodeIterator SGMLStringToXml(string strSGML)
     {
     Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader();
     sgmlReader.DocType = "HTML";
     sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
     sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
     sgmlReader.InputStream = new System.IO.StringReader(strSGML);
    
     // create document
     XmlDocument doc = new XmlDocument();
     doc.PreserveWhitespace = true;
     doc.XmlResolver = null;
     doc.Load(sgmlReader);
     return doc.CreateNavigator().Select("/*");
     }
    
     public string CurDir()
     {
     return (new System.IO.DirectoryInfo(".")).FullName;
     }
      ]]>
    
    </msxsl:script>
    <xsl:template match="node()" mode="PreventSelfClosingTags">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
        <xsl:text> </xsl:text>
      </xsl:copy>
    </xsl:template>
    <xsl:template match="@*" mode="PreventSelfClosingTags">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    
    
    
    并像这样使用它:

    <xsl:apply-templates select="myns:SGMLStringToXml(.)/body/*" mode="PreventSelfClosingTags"/>
    
    
    
    注意:您必须使用
    xslcomiledtransform
    实例手动运行转换。
    asp:xml
    控件不喜欢DLL引用。

    您的“格式错误”html是否真的在CDATA标记中?在您的问题中包含一个XML的小样本,以及一个您期望输出的示例,可能会有所帮助。谢谢它是xml编码的,所以
    html
    等等。我个人对html敏捷包的经验是,它在有效的html上工作得相当好,但是如果html格式不好,它会很快放弃。我们试着用它把用户粘贴到我们网站上的HTML转换成降价,但它总是会崩溃。