如何强制浏览器停止将动态插入的代码解析为HTML4

How to force the browser to stop parsing dynamically inserted code to HTML 4?

本文关键字:代码 HTML4 插入 动态 浏览器 何强制      更新时间:2023-09-26

我实际上需要将一些非常旧的HTML解析为PDF文件,我已经有了一个jar,但它只接受合法的XHTML代码。因此,我必须解析我的旧HTML代码,这样jar才会接受它。因为我非常清楚我解析的HTML代码会是什么样子。我的想法是使用John Resig的HTML Parser将某些标签(img、br、meta)解析为直接的XML,这将对它们产生所需的效果(主要是关闭标签)。

我的实际尝试是这样的:

function fixTags() {
    var tagsToParse = new Array( "br", "img", "input", "meta" );
    for(i = 0; i < tagsToParse.length; i++) {
        var elements = document.getElementsByTagName(tagsToParse[i]);
        for(j = 0; j < elements.length; j++) {
                elements[j].outerHTML = HTMLtoXML(elements[j].outerHTML);
        }
    }
}

这里的问题是,浏览器会将元素的新代码解释为HTML4,这导致他更改回我想要更改的内容。例如,<br>在经过解析器后变成了<br/>,但浏览器实际上会将其解释为HTML4,并且元素的outerHTML属性将再次为<br>

我解决这个问题的第一次尝试是强制文档暂时为XHTML:

var root = document.getElementsByTagName("html")[0];
root.setAttribute("xml", "http://www.w3.org/1999/xhtml");

但他的行为似乎一点也不困扰浏览器。

"显而易见"的解决方案是从dom构建一个字符串树,替换那里的字符串,并遍历树到我想要的字符串,对于这个"小"问题来说,这似乎有点太重和复杂了,这就是我问你的原因。

所以,如果有人有一个更简单的解决方案的想法,我会很高兴,应用程序是IE专用的,所以IE专用的解决方案也被接受。

对于您的用例,使用现有的HTML->XHTML转换器可能是最简单的,例如:http://www.it.uc3m.es/jaf/html2xhtml/simple-form.html

如果您真的想在浏览器中这样做,对于一个简单的解决方案,您可以尝试这样的方法,使用简单的正则表达式(通常不应该使用RegExp来解析XML)和XMLSerializer。

var serializer = new XMLSerializer();
var xml = serializer.serializeToString(document).replace(/<(img|meta|input|br|link)([^>]*)/gi, function (ignore, tagName, attributes) {
    return '<' + tagName + attributes + ' />';
});

如果不起作用,你可以查找一个不那么天真的正则表达式,但我认为对于一个可以转换为PDF的文档来说,这应该很有用。

EDIT:请注意,RegEx假定在执行此操作之前,这些标记都不是自动关闭的。