코드베이스 및 많은 프로젝트에서 처음으로 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;
}
schema
및 targetXml
는 다음 값을 주어 메모리 XML 문자열 (하지 파일의 URI)입니다 : 여기
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에 가서 내 스키마가 유효 함을 확인했다.
아무에게도 튀어 나오지 않습니까? 미리 감사드립니다!
나는 그것을 알아 내고 viktor를 사용해 볼 것이지만 SAXParser는 파싱 오류가 발생하면 SAXException을 던질 것으로 예상됩니다. 추천 한 기사를 살펴보면 작성자의 SimpleErrorHandler가 예외를 throw하는 것을 볼 수 없습니다. 이게 내가해야 할 일이야? System.outs 대신 SAXExceptions를 던져야합니까? – IAmYourFaja
내 자신의 질문에 대답 - 네, 정확히 무슨 일을해야합니다. DefaultHandler를 서브 클래스 화해, 경고, 에러, 및 fatalError 메소드를 오버라이드 (override)하지 않으면 안되는 것 (예외, 로그 등을 슬로우)을 실시 할 필요가 있습니다. 다시 한번 빅토르에게 감사드립니다! – IAmYourFaja