일부 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 유효성을 검사하지 것이다
위대한, 나는 이것을 가졌고 잘 작동했다. 최종 답변을 수락하기로 결정하기 전에 Michael의 응답을 완전히 평가하고 싶습니다. – mrswadge
매우 간단하다.'XSOMParser parser = new XSOMParser(); parser.setErrorHandler (..); parser.parse (IOUtils.toInputStream (xsdAsString));'이전 JRE에서 ** xsom14.jar **를 사용했는지 확인해야했지만. ** relaxngDatatype-2.2.jar **을 사용하고 있습니다. 도와 주셔서 감사합니다! – mrswadge