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