2012-07-27 4 views
3

일부 XML 스키마를 생성 중이며 생성자에서 유효한 XML 스키마 문서 (XML이 아닌)를 생성하고 있는지 확인하고자합니다. XML 스키마 문서의 유효성을 검사하는 코드를 만들려고했지만 비참하게 실패했습니다. 나는 그것이이 복합체 일 것이라고 생각하지 않았다.W3C XML 스키마 정의에 대한 XSD 유효성 검사

private void validateXsd(String xsdAsString) { 
    try { 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     factory.setValidating(true); 
     factory.setNamespaceAware(true); 
     factory.setFeature("http://apache.org/xml/features/validation/schema", true); 

     SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

     URL xmlSchemaXSD = this.getClass().getClassLoader().getResource("com/metamodel/xsd/XMLSchema.xsd"); 
     URL xmlSchemaDTD = this.getClass().getClassLoader().getResource("com/metamodel/xsd/XMLSchema.dtd"); 
     URL xmlSchemaDataTypes = this.getClass().getClassLoader().getResource("com/metamodel/xsd/datatypes.dtd"); 

     // requires that XMLSchema.dtd and datatypes.dtd are present in the same directory with the XMLSchema.xsd. 
     factory.setSchema(schemaFactory.newSchema(xmlSchemaXSD)); 

     SAXParser parser = factory.newSAXParser(); 
     // parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); 

     XMLReader reader = parser.getXMLReader(); 
     reader.setErrorHandler(new SimpleErrorHandler()); 
     reader.parse(new InputSource(IOUtils.toInputStream(xsdAsString))); 
    } catch(SAXParseException e) { 
     e.printStackTrace(System.err); 
    } catch (ParserConfigurationException e) { 
     e.printStackTrace(System.err); 
    } catch (SAXException e) { 
     e.printStackTrace(System.err); 
    } catch (IOException e) { 
     e.printStackTrace(System.err); 
    } 
    } 

이 코드는 내가 할 일에 상당히 가깝지만 다음 오류가 발생합니다. setSchema를 호출 할 때 나는 URL을 사용하고

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'jar:file:/r:/as4ot/lib/metamodel.jar!/com/metamodel/xsd/XMLSchema.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:172) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:382) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2245) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchema(XSDHandler.java:1590) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:438) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:556) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:523) 
    at com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl.newSchema(SchemaFactoryImpl.java:206) 
    at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:489) 
    at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:521) 

(URI)는 XMLSchema.dtd 및 datatypes.dtd 상대하는지 확인하고 나는 그들이 사용할 수있는 희망,하지만 난이를 확인할 수있는 방법을 확실입니다.

나는 XMLSchema.xsd, XMLSchema.dtd 및 datatypes.dtd가 내 jar 파일에 번들되어 클래스 로더에 의해로드된다는 사실을 좋아하지 않는다고 생각합니다. 이 문제를 해결하기 위해 어쨌든 org.xml.sax.SAXParseException : src-resolve : (n) '속성 선언'구성 요소에 'xml : lang'이름을 해석 할 수 없습니다.은 jar 파일 외부의 디렉토리 경로에서 XMLSchema를로드 할 때와 동일한 동작을한다고 가정합니다.

내 목표는 :이 깔끔하게 코드와 함께 제공 될 수 있도록 항아리 내부에서

  • 로드 XMLSchema.xsd.
  • xml : lang에 관한 다음 오류를 지나치십시오.

바라건대 내가 너무 많이 묻지 않 으면 좋겠다.

감사합니다, 스튜어트

난 당신이 몇 가지 이유에 대해 설명 된 방법을 사용하여 XSD 유효성을 검사하지 것이다

답변

3

는, 가장 중요한 하나는 언어와 XSD가 약하다는 그것을 포착하지 않습니다되고 그 자체 때문에 전체 사양. 따라서, 실제로 유효하지 않은 것을 유효성 검사 할 수 있습니다.

XSD 유효성 검사를 위해서는 전문화 된 프로세서가 있어야합니다. Java는 XSOM입니다. user guide을 따르십시오.

+0

위대한, 나는 이것을 가졌고 잘 작동했다. 최종 답변을 수락하기로 결정하기 전에 Michael의 응답을 완전히 평가하고 싶습니다. – mrswadge

+1

매우 간단하다.'XSOMParser parser = new XSOMParser(); parser.setErrorHandler (..); parser.parse (IOUtils.toInputStream (xsdAsString));'이전 JRE에서 ** xsom14.jar **를 사용했는지 확인해야했지만. ** relaxngDatatype-2.2.jar **을 사용하고 있습니다. 도와 주셔서 감사합니다! – mrswadge

2

저는 스키마에서 스키마에 대한 스키마의 유효성을 검사하는 것이 스키마의 모든 오류를 감지하지 않기 때문에 매우 유용하다고 생각하지 않습니다. 스키마가 유효한지 확인하는 유일한 방법은이를 스키마 프로세서에 전달하는 것입니다.

Processor p = new Processor(true); 
StreamSource ss = new StreamSource(new File('mySchema.xsd'); 
p.getSchemaManager().load(ss); 

는 스키마가 유효한지 여부를 알려줍니다 색슨

으로 예를 들어

.

+0

감사합니다. 비록이 방법을 시도했지만'p.getSchemaManager()'에서'null'을 반환 할 때'NullPointerException'을 계속 찾습니다. 나는 saxon9he.jar를 사용하고 있으며'Processor' 객체를 생성 할 때 라이선스 버전을'false'로 설정하려고 시도했지만 도움이되지 않았습니다. – mrswadge

+0

Saxon에서 스키마를 처리하려면 Saxon-EE를 받아야합니다. –

+0

XSOM 경로를 향해 가고 싶습니다. 구매를 기대하지 않습니다. 도움을 주셔서 대단히 감사합니다. – mrswadge

관련 문제