Java 应用XSLT时访问w3.org时出错

Java 应用XSLT时访问w3.org时出错,java,xslt,Java,Xslt,我正在将xslt应用于HTML文件(已经进行了过滤和整理,使其可以作为XML解析) 我的代码如下所示: TransformerFactory transformerFactory = TransformerFactory.newInstance(); this.xslt = transformerFactory.newTransformer(xsltSource); xslt.transform(sanitizedXHTML, result); private Source getSource

我正在将xslt应用于HTML文件(已经进行了过滤和整理,使其可以作为XML解析)

我的代码如下所示:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
this.xslt = transformerFactory.newTransformer(xsltSource);
xslt.transform(sanitizedXHTML, result);
private Source getSource(StreamSource sanitizedXHTML) throws ParsingException {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setNamespaceAware(false);
    spf.setValidating(false);  // Turn off validation

    XMLReader rdr;

    try {
        rdr = spf.newSAXParser().getXMLReader();
    } catch (SAXException e) {
        throw new ParsingException(e);
    } catch (ParserConfigurationException e) {
        throw new ParsingException(e);
    }

    InputSource inputSrc = new InputSource(sanitizedXHTML.getInputStream());
    return new SAXSource(rdr, inputSrc);
}
但是,我收到的每个doctype的错误如下:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
this.xslt = transformerFactory.newTransformer(xsltSource);
xslt.transform(sanitizedXHTML, result);
private Source getSource(StreamSource sanitizedXHTML) throws ParsingException {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setNamespaceAware(false);
    spf.setValidating(false);  // Turn off validation

    XMLReader rdr;

    try {
        rdr = spf.newSAXParser().getXMLReader();
    } catch (SAXException e) {
        throw new ParsingException(e);
    } catch (ParserConfigurationException e) {
        throw new ParsingException(e);
    }

    InputSource inputSrc = new InputSource(sanitizedXHTML.getInputStream());
    return new SAXSource(rdr, inputSrc);
}
错误:“服务器返回了URL:的HTTP响应代码:503”

我从浏览器访问DTD没有问题

我对正在解析的HTML几乎没有控制权,并且无法删除DOCTYPE,因为我需要它们来处理实体

欢迎任何帮助

编辑:

我试图禁用DTD验证,如下所示:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
this.xslt = transformerFactory.newTransformer(xsltSource);
xslt.transform(sanitizedXHTML, result);
private Source getSource(StreamSource sanitizedXHTML) throws ParsingException {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setNamespaceAware(false);
    spf.setValidating(false);  // Turn off validation

    XMLReader rdr;

    try {
        rdr = spf.newSAXParser().getXMLReader();
    } catch (SAXException e) {
        throw new ParsingException(e);
    } catch (ParserConfigurationException e) {
        throw new ParsingException(e);
    }

    InputSource inputSrc = new InputSource(sanitizedXHTML.getInputStream());
    return new SAXSource(rdr, inputSrc);
}
然后就叫它

    Source source = getSource(sanitizedXHTML);
    xslt.transform(source, result);
错误仍然存在

编辑2:

编写了一个实体解析器,并在本地磁盘上获得了HTML4.01过渡DTD。但是,我现在得到了这个错误:

错误:“实体“HTML.Version”的声明必须以“>”结尾。”


DTD是从w3.org下载的,我对一个相关问题有一些建议

特别是,在解析XML文档时,您可能希望关闭DTD验证,以防止解析器尝试获取DTD。或者,您可以使用自己的实体解析器返回DTD的本地副本,而不是通过网络获取它


Edit:仅在SAX解析器工厂上调用
setValidating(false)
可能不足以阻止解析器加载外部DTD。解析器可能需要DTD用于其他目的,例如实体定义。(也许您可以更改HTML清理/预处理阶段,用等效的数字字符实体引用替换所有实体引用,从而消除对DTD的需要?)


我认为没有一种方法可以确保外部DTD加载被完全禁用,因此您可能必须使用特定于解析器的东西。例如,如果您使用Xerces,您可能需要查找并调用
setFeature(“http://apache.org/xml/features/nonvalidating/load-external-dtd“,false)
只是为了确定

假设希望加载DTD(用于实体),则需要使用解析器。您所遇到的基本问题是,出于性能原因,W3C限制了对DTD URL的访问(如果没有,它们将无法获得任何性能)

现在,您应该使用DTD的本地副本,并使用目录来处理此问题。您应该看看apachecommons。如果你不知道如何使用目录,它们在


当然,如果进行验证,您将遇到问题。这是一个SGML DTD,您正在尝试将其用于XML。这将不起作用(可能)

谢谢您的建议,但问题仍然存在。我刚刚编辑了演示我如何尝试禁用DTD验证的内容。尝试了,从磁盘解析本地DTD时出错。请检查我的编辑。