“修理”不良HTML用于XSL转换的最佳方法(Best way to “fix” malformed

2019-11-02 11:55发布

我有一个包含恶意形成HTML已被XML编码的输入XML文档。 即XML文档本身在技术上是有效的。

现在我将XSL转换到输出格式良好XHTML5但包含恶意形成的HTML的XML。

坏的HTML的例子:

  • HTML,头和身体标签在HTML片段。
  • 字体标记
  • 不匹配的报价
  • 未关闭的标签
  • 没有匹配的开放额外的关闭标签
  • 以错误的顺序关闭标签(例如<b><u>text</b></u>

现在,在我的情况我其实不在乎的HTML是恶意形成的-我只关心我的关闭标签符合我的开放标签,无论在什么之间去。

所以我的问题是 - 什么是最好的方式,无论是

  1. 清理HTML足够,它不会影响其他标签(优选内变换本身)
  2. 或以某种方式标记closetag使HTML5兼容的浏览器承认它是不管什么讨厌的标记可能是之间在特定的开放标签的匹配。

对于2.我完全没有想法。 我有1一对夫妇的想法,如调用像整齐的外部工具或使用.NET SGML解析器

.NET XSL脚本( msxsl:script )是可接受的,如果不希望的。

实例源:

<xml>
  &lt;b&gt;&lt;u&gt;bad html&lt;/b&gt;&lt;/u&gt;
<xml>

示例输出:

<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 -->

还有什么其他的方法有哪些?

C#,VS2012,XSLT 1.0只

Answer 1:

是使用第三方库可以接受吗? 该HTML敏捷性包 (上的NuGet可)可能(根据网站)支持XSLT得到了一部分的方式解决您的无效的HTML,它也。



Answer 2:

我去使用SGML解析库,并转换为有效的XML。

我去触摸心灵的图书馆: https://github.com/MindTouch/SGMLReader

一旦编译并添加到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"/>

NB你必须运行与手动变换XslCompiledTransform实例。 在asp:xml控制不喜欢DLL参考。



文章来源: Best way to “fix” malformed html for use in an xsl transform