2009-11-13 6 views
6

다소 복잡한 XML 스키마를 Java의 스키마 개체로로드하려고 시도하고 있으므로 XML 메시지에 대한 유효성 검사를 일부 수행 할 수 있습니다.Java 구문 분석 스키마 가져 오기 및 포함?

내 코드는 다음과 유사합니다

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="base_1"> 
    <xs:import namespace="base_1" schemaLocation="common/MessageBase.xsd"/> 
</xs:schema>

... 등 :

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd"))); 

내 스키마가 꽤 많은 수입이있다. 스키마를로드하려고하면 많은 오류가 발생합니다. 이것과 관련된 다른 질문 하나에 따라 리소스 분석기를 지정해야하지만 기본적으로 처리해야하는 것은 아닙니다.

그렇다면 필자가 작성한 응용 프로그램을 실행하거나 기본 스키마 파일을 기준으로 스키마를 배치해야하는 특정 디렉터리가 있습니까?

마지막으로 XMLSpy 또는 이와 유사한 스키마를로드하면 정상적으로 작동하며 아무 문제없이 XML 인스턴스의 유효성을 검사 할 수 있습니다.

답변

8

기본 위치를 지정하지 않고 StreamSource를 사용하면 문제의 원인이라고 생각합니다.

파서는 기본 스키마의 위치를 ​​알 수 없으므로 공통/MessageBase.xml을 분석 할 수 없습니다.

두 개의 인수로 구성된 생성자를 사용하고 시작하는 경로 이름 인 SystemID를 전달하십시오.

StreamSource에 대한 javadoc을 참조하십시오. 당신은 자원의 해결과 스키마 공장을 연결해야 가져온 XSD를 해결하기 위해

+0

src-resolve : 'base : StatusWithError_optional'을 (n) '속성 그룹'구성 요소로 해석 할 수 없습니다. – magneticMonster

+0

다른 문제입니다. 그것은 귀하의 스키마가 완전하고 자체 포함되지 않았 음을 나타냅니다. StatusWithError_optional이라는 속성 그룹이 있습니까? 올바른 네임 스페이스에 있습니까? – bmargulies

+0

그래, 그것은 기본 스키마 파일과 같은 수준에서 별도의 파일에 정의되어 있습니다. 같은 네임 스페이스. systemID는 루트 .xsd 파일 또는 스키마의 루트 디렉토리 경로 여야합니까? 2-arg 생성자의 다른 인수는 어떨까요? – magneticMonster

2

:이 answer 볼 수 있습니다 더 자세한 내용

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
factory.setResourceResolver(new MyResourceResolver()); 
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd"))); 

.

7

StreamSource 대신 URL을 사용하는 경우 자원 분석기가 필요하지 않습니다.

URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(schemaFileName); 
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(schemaURL); 
+0

+1 훨씬 간단한 해결책! 나를 위해 일했다. – AKeefe

+0

은 리졸버가 필요하지 않으므로 간단합니다. – ulab

+2

이미 URL을 사용했지만 수입을 처리해야하는 경우에도 리소스를 올바르게 해결하지 못했습니다. 나는 ResourceResolver를 사용했고, 그것은 고정되었다. 왜 그것이 당신을 위해 일하고, 나를 위해서가 아니라는 것이 의문의 여지가 있습니다. 아마도 그것은 프로젝트 구조와 관련이 있습니다. 내 xsd 파일의 경로는 내 Java 클래스 경로와 관련이 있습니다. 가장 좋은 추측은 작업 폴더와 관련이있을 수 있다는 것입니다. – bvdb