2009-08-16 11 views
0

WebからダウンロードしたXHTML文書用のSAXパーサーを作成しようとしています。最初に私は(私はW3Cが意図的にDTDへのアクセスをブロックしているので、それがあったことをhereから出た)DOCTYPE宣言に問題を抱えていたが、私はしていることを固定:しかしJava - XHTML文書のSAXパーサー

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

、今私はよ2番目の問題が発生しました。それはXHTML文書に埋め込まれたいくつかのJavascriptを達したときにSAXパーサは例外をスロー:

<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エラーを回避し、実体参照エラーを避けることができますか?

乾杯、

ピート

+0

DTDを無効にする代わりに、ダウンロードして私のソフトウェアに組み込みリソースとして追加しました。パーザがそれを望むとき、私はそれをインターネットから取得するのではなく、ローカル/ダウンロード/キャッシュされたDTDのコピーに与えます。これはDTD処理を完全に無効にするよりも優れていると思います。 – ChrisW

答えて

4

(X)HTMLあなたが解析しようとしているが、(そうでなければ、SAX解析エラーを取得されません)有効なXMLではありません。そして、ダブルアンパサンド( "&&")はそれを確認します。つまり、それ自身では、XMLパーザを使用してドキュメントを解析することはできません。

適切なSAXイベントを生成するTagSoupなどのツールがありますが(以前と同じSAX/XML解析コードを使用できます)、TagSoupは不適切なHTMLイベントをマッピングします適切なSAX/XMLイベントに変換します。私はあなたがたとえばhttp://www.w3schools.com/TAGS/tag_script.aspために、CDATAセクション内のスクリプトの内容を置くことになっていると思う

1

は、次の例を示します:

<script type="text/javascript"><![CDATA[ 
document.write("Hello World!") 
//]]></script> 
+0

これに関するいくつかの追加情報:xhtmlはapplication/xhtml + xmlではなくmimetype text/htmlとして一般的に提供されます。そういうバグが可能なのはこのためです。 http://www.w3.org/TR/2002/NOTE-xhtml-media-types-20020801/も参照してください。 – wds

0

NekoHTMLおそらく同様にあなたのためにこれを修正します、あなたはとしてそれを使用しますXMLReader

あなたはSAXフィルタを使用している場合ではないすべてのパーサはLexicalHandler featuresをサポートするように、そのパーサ依存かもしれませんが、あなたはまた、あなたが<スクリプト>のためにstartElementに遭遇した後CDATA eventsを挿入することができるかもしれません。

関連する問題