このxhtmlファイルをxmlとして解析すると、そのような単純なファイルで解析するのに約2分かかります。私は、doctype宣言を削除すると、すぐにすぐに解析することが分かりました。このファイルが解析に時間がかかりすぎる原因は間違っていますか?恐ろしい性能XML形式のDoctypeを持つXHTMLファイルの解析
Javaの例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder bob = dbf.newDocumentBuilder();
Document template = bob.parse(new InputSource(new FileReader(xmlFile)));
XHTML例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ex="http://www.example.com/schema/v1_0_0">
<head><title>Test</title></head>
<body>
<h1>Test</h1>
<p>Hello, World!</p>
<p><ex:test>Text</ex:test></p>
</body>
</html>
おかげ
編集:ソリューション
実際にそれがあった理由について提供された情報に基づいて問題を解決するにはthで起きているクラスパス
- :E最初の場所、私はこれらの基本的な手順をしましたhow to validate XML using java?
新のEntityResolver
0:私の新しいのEntityResolver
を使用するために、私はSOそうに答え、これを参照しました新しいのEntityResolverを使用する方法
import java.io.IOException;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class LocalXhtmlDtdEntityResolver implements EntityResolver {
/* (non-Javadoc)
* @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, java.lang.String)
*/
@Override
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
String fileName = systemId.substring(systemId.lastIndexOf("/") + 1);
return new InputSource(
getClass().getClassLoader().getResourceAsStream(fileName));
}
}
:JavaはあなたのXHTMLファイルが指定されたDTDに従うことを検証するために、指定されたDTDとそのと含まれているファイルをダウンロードして
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder bob = dbf.newDocumentBuilder();
bob.setEntityResolver(new LocalXhtmlDtdEntityResolver());
Document template = bob.parse(new InputSource(new FileReader(xmlFile)));
他の人が指摘しているように、パーサーはインターネットからリソースをダウンロードしようとしています。これらのエンティティを自分で解決する必要があります(http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html#setEntityResolver%28org.xml.sax.EntityResolver%29) 。何らかの理由で – McDowell
が見つかった場合、この解決策は私にとってはうまくいかないでしょう。だから私はちょうどイカをインストールして追加しました。-Dhttp.proxyHost = localhost -Dhttp.proxyPort = 3128 – Leo