0

Web からダウンロードした XHTML ドキュメント用の SAX パーサーを作成しようとしています。最初は doctype 宣言に問題がありました (ここから、W3C が意図的に DTD へのアクセスをブロックしたことが原因であることがわかりました) が、次のように修正しました。

XMLReader reader = parser.getXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

しかし、今、2 つ目の問題が発生しています。SAX パーサーは、XHTML ドキュメントに埋め込まれた Javascript に到達すると、例外をスローします。

    <script type="text/javascript" language="JavaScript">
function checkForm() {
answer = true;
if (siw && siw.selectingSomething)
    answer = false;
    return answer;
}//
</script>

具体的には、パーサーは && に達するとエラーをスローします。これは、エンティティ参照が必要であるためです。正確な例外は次のとおりです。

`org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:391)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1390)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1814)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3000)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:624)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:486)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:810)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:740)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:110)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
at MLIAParser.readPage(MLIAParser.java:55)
at MLIAParser.main(MLIAParser.java:75)`

DTD を無効にしなければ、このエラーは発生しないのではないかと思います (わかりませんが)。では、DTD エラーを回避し、エンティティ参照エラーを回避するにはどうすればよいでしょうか?

乾杯、

ピート

4

3 に答える 3

3

解析しようとしている (X)HTML は有効な XML ではありません (そうでなければ、SAX 解析エラーは発生しません)。そして、2 つのアンパサンド (" &&") がそれを確認します。つまり、それ自体では、単純な XML パーサーを使用してドキュメントを解析することはできません。

適切な SAX イベントを生成するTagSoupなどの使用できるツールがあります(以前と同じ SAX/XML 解析コードを使用できます) が、TagSoup は不適切な形式の HTML イベントを適切な SAX/イベントにマッピングします。 XML イベント。

于 2009-08-16T13:09:13.467 に答える
1

たとえば、http://www.w3schools.com/TAGS/tag_script.aspは次の例を示しています。

<script type="text/javascript"><![CDATA[
document.write("Hello World!")
//]]></script>
于 2009-08-16T13:18:17.877 に答える
0

NekoHTMLもおそらくこれを修正します。これを XMLReader として使用します。

SAX フィルターを使用している場合は、<script> の startElement に遭遇した後にCDATA イベントを挿入することもできますが、すべてのパーサーがLexicalHandler 機能をサポートしているわけではないため、パーサーに依存する可能性があります。

于 2010-04-14T17:30:58.660 に答える