0

ウィキペディアの改訂履歴を POJO にロードする必要があるため、JAXB を使用してウィキペダのデータ ダンプ (つまり、その個々のページ) を非整列化しています。問題は、テキスト ノードに、ウィキペディアの xml ダンプで定義されていないエンティティが含まれることがあることです。例: ° (`°' は、読み取る必要があるエンティティの完全なセットがわからないことを覚えておいてください。私の入力ファイルは 3tb なので、html がレンダリングできるすべてのものがそこにあると仮定しましょう。 )。

有効な xml ではないエンティティを処理するように JAXB を構成するにはどうすればよいですか?

以下は、未定義のエンティティーに遭遇したときに JAXB がスローする SAX 例外です。

Exception in thread "main" javax.xml.bind.UnmarshalException

 - with linked exception:

[org.xml.sax.SAXParseException: The entity "deg" was referenced, but not declared.]

    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)

    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:481)

    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:199)

    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168)

    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)

    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)

    at com.stottlerhenke.tools.wikiparse.WikipediaIO.readPage(WikipediaIO.java:73)

    at com.stottlerhenke.tools.wikiparse.WikipediaIO.main(WikipediaIO.java:53)

Caused by: org.xml.sax.SAXParseException: The entity "deg" was referenced, but not declared.

    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)

    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)

    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)

    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)

    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)

    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(Unknown Source)

    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)

    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)

    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)

    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)

    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)

    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)

    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:195)

編集:その例外を引き起こした入力は、北極圏に関するウィキペディアの記事の完全な改訂履歴です。JAXB クラスの生成に使用される XSD は、http ://www.mediawiki.org/xml/export-0.3.xsd にあります。

編集:この問題の原因は、私の側のエラーでした。エンコードされたエンティティを適切に維持していない最初のエクストラクタを使用していました。ただし、誰かが私が抱えていると思っていた問題を抱えている場合は、これを回避する方法を見つけました。下記参照。

4

2 に答える 2

1

エンティティーの解決は JAXB の仕事ではありません。これは、基礎となる XML パーサーの仕事です。

あなたができることは次のとおりです。

  • DOM を使用して自分でデータを読み取る
  • すべての未解決のエンティティを希望するものに置き換えます
  • 次に、JAXBに結果を処理させます
于 2009-06-22T23:09:57.853 に答える
0

これはハックですが、ピンチで機能します。

w3.orgからhtmlエンティティ定義をダウンロードし、入力xmlファイルのdoctypeをxhtml-transitionalに設定しましたが、doctypeurlをローカルのdtdに送信しました。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd">

xhtml1-transitional.dtdには、次のものが必要です。

  • xhtml-lat1.ent
  • xhtml-special.ent
  • xhtml-symbol.ent

私はそれを吸い取ってxhtml1-transitional.dtdと一緒に置きました

(すべてのファイルはhttp://www.w3.org/TR/xhtml1/DTD/で入手できます)

私が言ったように、地獄のように醜いですが、それ仕事をしているようでした。

于 2009-06-23T16:14:28.387 に答える