3

さまざまなページを読み込んでデータを抽出するスクリーン スクレイピング アプリを作成しています。私はSAXParserFactorygo get aSAXParserを使用していXMLReaderます。次のように Factory を構成しました。

spf = SAXParserFactory.newInstance();
spf.setValidating(false);
spf.setFeature("http://xml.org/sax/features/validation", false);
spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
spf.setFeature("http://xml.org/sax/features/use-entity-resolver2", false);

ただし、&nbspエンティティを含むドキュメントを解析するたびに、

SEVERE: null
    org.xml.sax.SAXParseException: The
    entity "nbsp" was referenced, butnot declared.
            at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231)
            at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)

工場にDTDを読まないように言ったので、エンティティが見つからないことは理解できますが、エンティティチェックをすべて無効にするにはどうすればよいですか?

編集:これは Android アプリ用です。そのため、標準環境にない API/ライブラリを使用することに消極的です。

4

4 に答える 4

2

SAX ではこれができないようですが、StAX API では可能です。これを設定する方法については、この前の質問/回答を参照してください。

XML プロセッサを手作業で作成している場合、StAX API は SAX API よりもはるかに扱いやすいため、両方の点で優れています。

于 2010-01-03T18:20:55.630 に答える
1

HTML ページを読んでいる場合は、有効な HTML でさえ XML ではなく、ほとんどの HTML が無効であるという事実に対処するライブラリの 1 つを使用することを強くお勧めします。次のいずれかを試してください。

編集: Android アプリであることを確認しました。それはそれをより厳しくするつもりです。NekoHTML は 109kb、TagSoup は 89kb です。

于 2010-01-03T18:09:31.763 に答える
0

独自の DOMErrorHandler インスタンスを作成することで、これらのエラーを傍受できると思います - 詳細はこちら: http://xerces.apache.org/xerces2-j/faq-write.html

このアプローチを使用して、Corel Draw 12 によって生成された XML SVG ドキュメントとして図面を解析すると、出力されるドキュメントで SVG DTD ルールが破られることがあるという問題を回避しました。

DTD を読まないように指示したのはなぜですか? これは、インターネットに接続して W3C サーバーからこれにアクセスしたくないためです。ローカル DTD を使用したスタンドアロンのオフネットワーク ソリューションが必要ですか? 同じものが必要でした: SVG DTD とモジュールをローカルにダウンロードし、この Java ライブラリを使用してローカル DTD アクセスを強制しました: http://doctypechanger.sourceforge.net/

于 2010-01-03T17:38:49.157 に答える
0

何をすべきかを理解するパーサーの機能を無効にしたようです 。SAX パーサーがこのエンティティーをまったく理解していない場合、SAX パーサーが何をすることを期待しますか。

おそらく、HTML をスクレイピングしている場合は、JTidyを使用したほうがよいでしょうか? これは、さらなる分析のために HTML を DOM に表示する HTML パーサーです。

于 2010-01-03T17:40:48.403 に答える