2011-12-27 5 views
2

XML이 아닌 XSD 파일의 유효성을 검사하고 싶습니다. 내가 사용하고있는 접근법은 다른 XML 파일로 XSD를 처리하고이 www.w3.org/2001/XMLSchema.xsd을 스키마로 사용하는 것입니다.XSD 파일 유효성 검사

String schemaLang = "http://www.w3.org/2001/XMLSchema"; 
SchemaFactory factory = SchemaFactory.newInstance(schemaLang); 
Schema schema = factory.newSchema(new StreamSource("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd")); 
Validator validator = schema.newValidator();   
validator.validate(new StreamSource("shiporder.xsd")); 

을하지만 난 다음 오류가 점점 오전 :

나는 다음과 같은 코드를 사용하고 오류가 파일 경로가 올바른지로 무엇

Failed to read schema document '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> .

확실하지.

XSD 파일의 유효성을 검사하는 올바른 방법을 알려주십시오.

+1

스키마의 유효성을 검사하는 데 문제가 없습니다.오류 메시지가 말하는 것처럼 프로그램은'XMLSchema.xsd'를 읽을 수 없습니다. 자신의 스키마를 검증하는 것만으로는 충분하지 않습니다. 프로그램의 처음 세 줄은 다음 2 줄을 걱정하기 전에 수정해야합니다. 'shiporder.xsd' 스키마는 질문과 관련이 없습니다. – skaffman

+0

@skaffman - 처음 3 줄에 어떤 수정이 필요한지 말할 수 있습니까? 나는 코드 @ java2s.com을 가지고있다 – Anand

+0

스키마를 읽는 한, 스키마는 w3c에서 다운로드되고 그 이후에는 변경되지 않는다. – Anand

답변

1

XMLSchema.xsd 옆에 두 개의 추가 파일이 있어야합니다. 이들은 :

XMLSchema.xsd 참조이 두 파일을.

오른쪽 옆에 , 그래서 XMLSchema.xsdC:/XMLSchema.xsd에있는 경우 당신은 C:/XMLSchema.dtdC:/datatypes.dtd을 가지고 있습니다.

SchemaFactory 인스턴스 (SchemaFactory.setResourceResolver(LSResourceResolver) 참조)는 XMLCatalogResolver이라는 내부 클래스를 기본으로 사용하며 LSResourceResolver을 구현합니다. 전자는 리퍼러 옆에있는 참조 된 파일을 찾습니다.

당신이 정말 하드은 다음 SAXParseException의 원인은 시스템이 XMLSchema.dtd 파일을 찾을 수 없습니다라는 FileNotFoundException하다 보면.

이 외에도 코드가 정상적으로 작동하며 스키마도 정상입니다.

0

javadoc for the StreamSource class에 따르면 String을 사용하는 생성자 메서드를 사용하는 경우 해당 문자열은 유효한 URI 여야합니다. 예를 들어, 로컬 파일을 참조하려는 경우, 경로 앞에 file:/을 접두어로 붙이십시오. 요약

Schema schema = factory.newSchema(new File(new StreamSource("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd"))); 

, 예를 들어, 프로그램이 필요한 파일을 찾을 수 없습니다로 인한 문제를 배제하기 위해 몇 가지 간단한 테스트를 할이 경우에 도움이 될 것입니다 : 다른 방법으로는 생성자에 File 개체를 전달할 수 있습니다

File schemaFile1 = new File("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd"); 
File schemaFile2 = new File("shiporder.xsd"); 
assert schemaFile1.exists(); 
assert schemaFile2.exists(); 
+0

파일이 존재하는 경우,'file : //'을 사용하거나 사용하지 않고'File' 또는'StreamSource'를 사용하는 것은 중요하지 않습니다; 참조 된 파일이 누락되었습니다. –

0

달성하려는 목표는 무엇입니까? factory.newSchema (X)가 예외를 throw하지 않으면 X는 유효한 스키마 여야합니다 (*). 이는 스키마 문서의 스키마에 대한 유효성 검사보다 훨씬 간단한 작업입니다.

(*) 역순은 반드시 사실 일 필요는 없습니다. X는 스키마. 서에 대해 스키마에 유효 할 수 있지만 UPA 제한을 위]하는 것과 같은 다른 이유로는 유효하지 않을 수 있습니다.

+0

제 답변을 토대로 약간의 테스트를했습니다. 나는'XMLSchema.xsd'를 로딩하여'Schema'를 만들고 자체에 대해 검증했다. 평균적인 시스템로드에는 30.76 초가 걸렸으며 유효성 검사에는 232.3 밀리 초가 걸렸습니다. OP에서 _heavy_ 스키마 파일 유효성 검사를하고 싶다고 가정하면 XML 파일 용 XML 스키마를 메모리에로드하고 파일에 대한 유효성을 검사하여 모든 입력 파일에 대해 새로운 '스키마'를 작성하는 것이 좋습니다. –