JAXBを使用してhtmlエンティティでxmlを非整列化する
質問
ウィキペディアの改訂履歴をPOJOにロードする必要があるため、JAXBを使用してウィキペイダデータダンプをアンマーシャルします(まあ、個々のページ)。問題は、Wikipedia xmlダンプで定義されていないエンティティがテキストノードに含まれることがあることです。例:° ( `& deg; 'は、読み取る必要があるエンティティの完全なセットがわからないことに注意してください。入力ファイルは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
編集:この問題の原因は、私の側のエラーでした-エンコードされたエンティティを適切に維持しなかった最初のエクストラクターを使用していました。しかし、もし誰かが私が抱えていた考え問題を抱えているならば、私はこれを回避する方法を見つけました。以下を参照してください。
解決 2
これはハックですが、ピンチで動作します。
w3.orgからhtmlエンティティ定義をダウンロードし、入力xmlファイルのdoctypeをxhtml-transitionalに設定しましたが、doctype urlをローカル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 / )
私が言ったように、地獄のようにいですが、それはやった仕事をしているようです。
他のヒント
エンティティの解決は、JAXBの仕事ではありません。それは根底の仕事です XMLパーサー。
できることは:
- DOMを使用してデータを自分で読む
- 未解決のすべてのエンティティを希望するものに置き換えます
- 次に、JAXBに結果を処理させます