2011-12-08 2 views
3

코드베이스 및 많은 프로젝트에서 처음으로 XML 스키마 유효성 검사기를 재사용 가능한 구성 요소로 구축하려고합니다. 나는 하루 종일 예제를 따르고 코딩하려고 노력했으며, 지금은 개념 증명을하고 실행하고 있습니다.Java SAXParser 위양성

유일한 문제는 위양성 : 절대적으로 실패해야하는 검증 XML 인스턴스입니다. 나는 3 개의 스키마에서 그것을 테스트 해 보았습니다 : 1 개의 스키마는 아름답게 작동했으며, 이제는 마지막 두 개 (오 탐지)와 오동작합니다. 필자가 시도한 첫 번째 스키마/인스턴스 쌍은 극히 간단하기 때문에 필자는 그것을 믿는다. 나는 이제 더 복잡한 예제에 사용하려고 노력하고 있으며 질식하고 있습니다.

schema = getSchemaAsString(); 
targetXml = "ijeioj489fu4u8"; 

SAXParserFactory oSAXParserFactory = SAXParserFactory.newInstance(); 
SAXParser oSAXParser = null; 
oSAXParserFactory.setNamespaceAware(true); 

try 
{ 
    SchemaFactory oSchemaFactory =  
    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    oSAXParserFactory.setSchema(oSchemaFactory.newSchema(new SAXSource(new InputSource(new StringReader(schema))))); 

    oSAXParser = oSAXParserFactory.newSAXParser(); 

    DefaultHandler handler = new DefaultHandler(); 

    oSAXParser.parse(new InputSource(new StringReader(targetXml)), handler); 
} 
catch(Exception oException) 
{ 
    throw oException; 
} 

schematargetXml는 다음 값을 주어 메모리 XML 문자열 (하지 파일의 URI)입니다 : 여기

는 SAX 검증이 이루어집니다 validate 방법의 몸입니다 :

schema 문자열 :

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
<xs:element name="PayloadMessage"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="MessageID" type="xs:long"/> 
      <xs:element name="Timestamp" type="xs:long"/> 
      <xs:element name="MessageAction" type="xs:string"/> 
      <xs:element name="ContentType" type="xs:string"/> 
      <xs:element name="ContentID" type="xs:string"/> 
      <xs:element name="Payload" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

물론, 주어진 targetXml는 주어진 스키마에 대해 실패한다. Nope. 예외는 SAX 물건 내부 어디에도 던지지 않습니다.

나는 내가 DefaultHandler하지만 확실히 뭔가를 할 필요가 느낌이 ... 나는 http://www.w3.org/2001/03/webdata/xsv에 가서 내 스키마가 유효 함을 확인했다.

아무에게도 튀어 나오지 않습니까? 미리 감사드립니다!

답변

1

SAXException을 던질 오류 처리기를 설정해야합니다. 기본 동작은 문서가 유효하지 않은 경우에도 구문 분석을 시도하는 것입니다. DefaultHandlerErrorHandler이지만 을 구현합니다. 오류 또는 경고의 경우 구현시 아무 것도 수행하지 않습니다..

Javadoc 경고 : 응용 프로그램이 ErrorHandler를 등록하지 않으면 XML 구문 분석 오류가보고되지 않습니다. 단, 치명적인 오류가 발생하면 SAXParseExceptions이 throw됩니다. 유효 에러를 검출하기 위해서, error() 호출로 무엇인가를하는 ErrorHandler를 등록 할 필요가 있습니다.

이 우수한 tutorial은 XML 유효성 검사에 대한 예제가 있습니다. 그것은 나를 위해 가장 도움이되었다.

+0

나는 그것을 알아 내고 viktor를 사용해 볼 것이지만 SAXParser는 파싱 오류가 발생하면 SAXException을 던질 것으로 예상됩니다. 추천 한 기사를 살펴보면 작성자의 SimpleErrorHandler가 예외를 throw하는 것을 볼 수 없습니다. 이게 내가해야 할 일이야? System.outs 대신 SAXExceptions를 던져야합니까? – IAmYourFaja

+0

내 자신의 질문에 대답 - 네, 정확히 무슨 일을해야합니다. DefaultHandler를 서브 클래스 화해, 경고, 에러, 및 fatalError 메소드를 오버라이드 (override)하지 않으면 안되는 것 (예외, 로그 등을 슬로우)을 실시 할 필요가 있습니다. 다시 한번 빅토르에게 감사드립니다! – IAmYourFaja

관련 문제