2

我实际上需要将一些非常旧的 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,这导致他更改回我想要更改的内容。例如 a在经过解析器后<br>变成 a ,但浏览器实际上会将其解释为 HTML4 并且元素的 outerHTML 属性将再次为。<br/><br>

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

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

但这似乎并没有在他的行为中打扰浏览器。

从 dom 构建字符串树的“明显”解决方案,替换那里的字符串并将树遍历到我想要的字符串对于这个“小”问题来说似乎有点过于繁重和复杂,这就是我问你的原因。

因此,如果有人对更简单的解决方案有想法,我会非常高兴,该应用程序仅限 IE,因此也接受 IE 专有解决方案。

4

1 回答 1

0

对于您的用例,使用现有的 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 的文档应该可以解决问题。

编辑:请注意,RegEx 假定在此操作之前这些标签都不会自动关闭。

于 2013-07-25T13:46:40.167 回答