2009-09-22 4 views
0

예를 들어 노드 구조 또는 이와 비슷한 것을 유효성 검사기에서 얻을 수 있습니까? 청취자 나 처리기와 같은 것. 예외로는 충분하지 않습니다. 오류가 발생한 노드를 선택해야합니다. 그게 내가 지금까지 구축 한 것.색소 검사기에서 더 많은 정보를 얻으십시오

def factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) 
def schema = factory.newSchema(new StreamSource(new FileReader("src/import.xsd"))) 
def validator = schema.newValidator() 
try { 
    validator.validate(new StreamSource(new FileReader("src/import.xml"))) 
    println "everything is fine" 
} catch(SAXException e) { 
    println e 
} 

감사합니다.

답변

1

구문 분석 할 때 유효성을 검사합니다. 다음은 아주 간단합니다 자바의 코드는,의 그루비의 번역과 같습니다

InputStream xml = // … 
InputStream xsd = // … 

SchemaFactory xsFact = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = xsFact.newSchema(new StreamSource(xsd)); 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setValidating(false); 
dbf.setSchema(schema); 
DocumentBuilder db = dbf.newDocumentBuilder(); 

Document dom = db.parse(new InputSource(xml)); 
+0

이제 XML의 DOM이 생겼으나 오류의 위치를 ​​어떻게 알 수 있습니까? 나는 다음과 같은 것을 의미합니다 : cvc-length-valid : 길이 '6'의 값 'aaaaaa'는 'stringLength5'유형의 길이 '5'에 대해면 유효하지 않습니다. – codevour

+0

SAXException은 오류의 줄 번호와 열 번호를 추적하므로 요소가 아니라 원본 파일과 다시 관련됩니다. 응답 한 후에는 소스를 검사하여 구현 유형으로 전송하여 더 많은 정보를 얻을 수 있는지 알아 보았지만 실제로는 그렇지 않습니다. 내가 말할 수있는 것은 당신의 고통을 느낍니다. 그것은 API에서 확실한 감독입니다. – kdgregory

+0

그리고 확실하지 않은 경우 : 'db.parse()'호출은 try/catch로 래핑되어야합니다. – kdgregory

0
더 많은 오류를 얻을 수있는 에서는 SAXParseException를 사용할 필요가

또는 SAX locator 당신이 가능 렉서를위한 ContentHandler를 구현하고있는 경우 . 예외는 줄 번호에 대한 세부 정보를 제공합니다.

try{ 
    ... 
} 
catch(SAXParseException e){ 
    int lineNumber = e.getLineNumber(); 
    int columnNumber = e.getColumnNumber(); 
    String message = e.getMessage(); 
    // do something 
} 
catch(SAXException e){ 
    // what should we do? 
    // if we're implementing ContentHandler 
    // we can use the org.xml.sax.Locator to get more info 
} 

보통 로케이터에서 열 정보는 -1를 반환합니다. 오프셋 정밀도를 들어, 확장의 ContentHandler 또는 렉서 사용 중 하나를해야합니다 : 시작 태그 (

  • 오류
  • 추정 회선 정보, 속성 노드의 위치의 줄 번호를 가져 오기를, 끝 태그)를 렉서 (lexer) 나 정규 표현식 또는 다른 것을 사용합니다.
0

얼마나 많은 제어권을 환경에두고 있느냐에 따라 다소 어색한 방법이 있습니다. 기본 파서의 드롭 인 대체품 인 Xerxes 2 XML 파서는 현재 노드를 가져 오기 위해 Validator에 속성을 가지고 있으므로 Validator에 대한 참조를 유지하면 (예 : Validator에 대해 설정 한 ErrorHandler의 필드로 Validator, 예를 들어) 노드 구조를 얻을 수 있습니다. 다음은 Java에서이 작업을 수행 한 방법입니다.

... 
    Validator validator = schema.newValidator(); 
    validator.setErrorHandler(new MyErrorHandler(validator)); 
... 



public class MyErrorHandler implements ErrorHandler { 
    private Validator validator; 

    public AnnotatingErrorHandler(Validator v) { 
    super(); 
    validator = v; 
    } 

    @Override 
    public void error(SAXParseException e) throws SAXException { 

    try { 
     element = (Element)validator.getProperty("http://apache.org/xml/properties/dom/current-element-node"); 
    } catch (SAXNotRecognizedException e) { 
     log(Level.SEVERE, "Xerxes 2 XML parser is required", saxnre); 
    } catch (SAXNotSupportedException e) { 
    ; // shouldn't happen in this context 
    } 
    ... // do stuff 
    } 
    ... 
} 
0

동일한 문제를 해결하고 다음을 사용하여 해결했습니다.

  1. 유효성 검사 메소드를 사용할 때 사용되는 SAXSource입니다.
  2. 사용됨 SAXParseException을 캡처하기 위해 오류 처리기를 구현했습니다.
+0

대답은 코드 샘플에 도움이 될 수 있습니다. –

관련 문제