JAXB를 사용하여 HTML 엔티티와 함께 ​​XML을 해제하지 않습니다

StackOverflow https://stackoverflow.com/questions/1029462

  •  06-07-2019
  •  | 
  •  

문제

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가 결과를 처리하도록하십시오
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top