JAXB를 사용하여 HTML 엔티티와 함께 XML을 해제하지 않습니다
문제
Wikipedia Revision Histories를 Pojos에로드해야하므로 JaxB를 사용하여 Wikipeida 데이터 덤프 (잘, 개별 페이지)를 해소하지 않습니다. 문제는 텍스트 노드에 가끔 Wikipedia XML 덤프에 정의되지 않은 엔티티가 포함된다는 것입니다. EG : ° (° '즐거움은 읽을 수있는 전체 엔티티 세트를 모릅니다. 입력 파일은 3TB이므로 HTML이 렌더링 할 수있는 모든 것이 거기에 있다고 가정 해 봅시다.) .
유효한 XML이 아닌 엔티티를 처리하도록 JAXB를 어떻게 구성하려면 어떻게해야합니까?
다음은 JAXB가 정의되지 않은 엔티티를 만나면 던지는 색소폰 예외입니다.
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가 결과를 처리하도록하십시오