2011-09-22 5 views
0

현재 Java 1.6을 사용하여 많은 XML 파일을 가져 오는 도구를 작성 중입니다. 모든 파일은 DocBook 4.5 DTD (xmllint를 사용하여 확인하고 DocBook 4.5 DTD를 --dtdvalid 매개 변수로 지정)에서 유효성을 검사하지만 DOCTYPE 선언을 모두 포함하는 것은 아닙니다. 이 아주 잘 근무하고 대부분의 경우DocumentBuilder에서 XML 구문 분석에 사용할 DTD를 지정 하시겠습니까?

private Document fileToDocument(File input) throws ParserConfigurationException, IOException, SAXException { 

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

    factory.setNamespaceAware(true); 
    factory.setIgnoringElementContentWhitespace(false); 
    factory.setIgnoringComments(false); 
    factory.setValidating(false); 
    factory.setExpandEntityReferences(false); 

    DocumentBuilder builder = factory.newDocumentBuilder(); 
    return builder.parse(input); 

} 

나는 그가 나무를 탐색하는 객체 반환 사용하여 수행 할 수 있습니다 :

나는과 같이 필요한 조작을 수행하기 위해 DOM에 각 XML 파일을로드 필요한 조작을 한 다음 문서를 다시 작성하십시오.

  • 는 DOCTYPE 선언을 포함하지 말고,
  • 할 일이 DTD에 정의 된 개체 포함 (예를 & mdash를 위해/—을) : 나는 문제가 발생하고 경우 파일있는 것입니다. 이 예외가 builder.parse에서 발생되는 경우입니다

(...) 메시지와 함께 전화 : 충분히

[Fatal Error] :5:15: The entity "mdash" was referenced, but not declared. 

박람회가 선언되지 않습니다. 이 인스턴스에서 필자가 이상적으로 할 일은 DocumentBuilderFactory가 파일에 지정되었는지 여부에 관계없이 항상 DocBook 4.5 DTD를 사용하도록 설정하는 것입니다.

DocBook 4.5 스키마를 사용하여 유효성 검사를 시도했지만 XML과 관련된 많은 관련이없는 오류가 발견되었습니다. 이 버전의 DocBook 사양에서는 스키마가 DTD와 기능적으로 동일하지 않을 수 있습니다.

내가 생각할 수있는 다른 옵션은 파일을 읽고 doctype이 설정되었는지 여부를 감지 한 다음 DOM에 XML을 실제로 구문 분석하기 전에 아무 것도 발견되지 않았 으면 설정합니다.

내 질문은 퍼서에게 특정 DTD를 사용하거나 해석하지 않는 엔티티 (구문은 아니지만 예제는 있지만 모든 엔티티가 포함되어 있음에도 불구하고 구문 분석이 진행됨을 확인하는 것을 보지 못한 경우)가 더 똑똑한 방법입니다. XML - 많은 잠재력이있다)?

답변

1

EntityResolver2를 사용하고 EntityResolver2.getExternalSubset()을 구현하면 도움이 될 수 있습니까?

... This method can also be used with documents that have no DOCTYPE declaration. When the root element is encountered, but no DOCTYPE declaration has been seen, this method is invoked. If it returns a value for the external subset, that root element is declared to be the root element, giving the effect of splicing a DOCTYPE declaration at the end the prolog of a document that could not otherwise be valid. ...

+0

감사합니다. EntityResolver2 인터페이스 (EntityResolver 만)를 알지 못했습니다. 제안 된 메서드를 오버로드하고 다른 메서드에 대한 기본 처리를 제공하면이 오류가 발생합니다. [치명적인 오류] docbookx.dtd : 101 : 9 : 재귀 적 엔터티 참조 "% dbnotn". (참조 경로 : % dbnotn -> % dbnotn -> % dbnotn) 이것을 바탕으로 DTD가 이제는 적어도 적용되었지만 다른 문제가 있음을 알 수 있습니다 :). – xsgordon