2012-08-01 2 views
4

XML 문서의 유효성을 검사하기 위해 여러 xsd 스키마를 사용하고있었습니다.DTD를 지원하는 Java ValidationAPI 라이브러리

public static Schema createSchemaXSD(InputStream inputXSD, LSResourceResolver resolver) throws SAXException { 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    factory.setResourceResolver(resolver); 
    Source schemaSource = new StreamSource(inputXSD); 
    Schema schema = factory.newSchema(schemaSource); 
    return schema; 
} 

LSResourceResolver 루트 스키마는 XSD에 포함 XSD 스키마로드를 해결할 수있는 클래스를 개발하기위한 인터페이스입니다 : 이것은 내가 그렇게 사용 된 코드의 조각이었다.

갑자기, 나는 여러 DTD를 상대로 검증을 전환 할 필요가 내 스키마가 (이 아닌 파일 시스템)가 포장되기 때문에로드, 클래스 경로에서 파일을 포함 것을 구현을 쓴, 그래서 나는 코드를 변경 :

public static Validator createValidatorDTD(InputStream inputDTD, LSResourceResolver resolver) throws SAXException { 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.XML_DTD_NS_URI); 
    factory.setResourceResolver(resolver); 
    Source schemaSource = new StreamSource(inputDTD); 
    Schema schema = factory.newSchema(schemaSource); 
    Validator validator = schema.newValidator(); 
    return validator; 
} 

불행히도 이것은 작동하지 않습니다. 그것은 SchemaFactory를 위해 공장을 만드는 방법에 예외가 발생합니다 :

No SchemaFactory that implements the schema language specified by: http://www.w3.org/TR/REC-xml could be loaded 

가 나는 연구 논문을 기반으로 않았다 Java XML Validation APIjava.xml.validation documentation. 그들은 모두 XMLConstants.XML_DTD_NS_URI이 지원되지만 Sun의 JDK 5 (및 JDK 6에서 볼 수있는 한)에서는 구현되지 않았으며 DTD 유효성 검사를 지원하는 다른 라이브러리를 사용해야한다고 지정합니다.

Google에서 검색하려고했지만 아무 것도 찾지 못했습니다 (또는 검색 방법을 알지 못함). DOM과 TrAX를 사용하여 DTD에 대해 문서의 유효성을 검사 할 수 있지만 파일 시스템에 DTD가 있어야합니다. 내 DTD 및 스키마가 클래스 경로에 있으므로 내 DTD에 대한 사용자 지정로드가 필요합니다. 그래서 더 큰 유연성을 제공하기 때문에 처음에는 javax.xml.validation.SchemaFactoryjavax.xml.validation.Schema을 사용했습니다.

내 질문은 : 자바 유효성 검사 API (XML_DTD_NS_URI)를 통해 DTD 유효성 검사를 지원하는 라이브러리 (또는 라이브러리)가 있습니까? 나는 다른 유형의 솔루션에 열려 있습니다.

답변

0

해결 방법은 DTD와 XML을 연결하고 .schema없이 구문 분석하거나 유효성을 검사하는 것입니다. 예 :

String dtd; 
String xml; 
.... 
.... 

src = new InputSource(new ByteArrayInputStream((dtd + xml).getBytes())); 
try { 
    factory = DocumentBuilderFactory.newInstance(); 
    factory.setValidating(true); 
    factory.setIgnoringComments(true); 
    builder = factory.newDocumentBuilder(); 
    partnersDoc = builder.parse(src); 
} catch (ParserConfigurationException ex){ 
    ex.printStackTrace(System.err); 
} 
관련 문제