首页 > 解决方案 > 我如何解析 document.write/response.write 以对 AngleSharp 使用单引号而不是双引号?

问题描述

我正在使用旧的html(ASP) 文件,我需要转换/解析它们以使用新的浏览器。

我正在使用 AngleSharp,我的问题是当它尝试解析使用单引号作为其值的响应document.write并且 AngleSharp 将其解析为双引号时。

输入

Response.Write ("<input type=text name=attrname value='" + sVar + "'>");

输出(锐角)

Response.Write ("<input type="text" name="attrname" value="&quot; + sVar + &quot;">");

预期输出

Response.Write ("<input type='text' name='attrname' value='" + sVar + "'>");

有没有办法跳过解析或为两者设置不同的格式?先感谢您!

标签: anglesharp

解决方案


序列化由IMarkupFormatter. 默认情况下,此格式化程序对属性使用双引号(因为格式化程序不知道您在某些 ASP 代码中,而您在外部使用双引号)。

最简单的方法是滚动您自己的格式化程序(示例):

class MyMarkupFormatter : HtmlMarkupFormatter
{
    protected override string Attribute(IAttr attr)
    {
        return $"{attr.Name}='{attr.Value}'";
    }
}

你可以像这样使用它:

var config = Configuration.Default;
var context = BrowsingContext.New(config);
var input = "<input type=text name=attrname value='\" + sVar + \"'>";
var document = await context.OpenNewAsync();
var formatter = new MyMarkupFormatter();
document.Body.InnerHtml = input;
document.Body.FirstChild.ToHtml(formatter).Dump(); // <input type='text' name='attrname' value='" + sVar + "'>

请注意,Attribute仅出于说明目的,实现如此简单。您应该处理更多案例(并可能处理转换包含的单引号等)。


推荐阅读