C# “最好的方法”;“固定”;用于xsl转换的格式错误的html
我有一个输入xml文档,其中包含格式错误的html,该html已被xml编码。 i、 e.xml文档本身在技术上是有效的 现在,我将对xml应用xsl转换,该xml输出格式良好的xhtml5,但包含格式错误的html 错误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格式是否错误——我只关心我的结束标记是否与开始标记匹配,而不
- html片段中的html、head和body标记
- 字体标签
- 不匹配的引号
- 未闭合标签
- 没有匹配打开的额外关闭标记
- 按错误的顺序关闭标记(例如,
)text
msxsl:script
)是可以接受的,如果不需要的话
示例来源:
<xml>
<b><u>bad html</b></u>
<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转换成降价,但它总是会崩溃。