大家早上好!
我正在以这种方式对xsd验证xml:
ValidationEventCollector vec;
URL xsdUrl;
Schema schema;
FicheroIntercambio fichero;
vec = new ValidationEventCollector();
try{
xsdUrl = FicheroIntercambio.class.getResource("xsd/file.xsd");
SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
schema = sf.newSchema(xsdUrl);
jaxbContext = JAXBContext.newInstance("file.dto");
unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(schema);
unmarshaller.setEventHandler(vec);
bais = new ByteArrayInputStream(peticion.getBytes("UTF-8"));
fichero = (FicheroIntercambio)unmarshaller.unmarshal(bais);
bais.close();
}catch(Exception ex){
String validacionXml="";
if(vec!=null && vec.hasEvents()){
for(ValidationEvent ve:vec.getEvents()){
validacionXml += ve.getMessage();
}
}else{
validacionXml += ex.getLocalizedMessage();
}
}
部分xsd是:
<xs:element minOccurs="1" maxOccurs="1" name="Indicador_Prueba">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="1"/>
<xs:enumeration value="0"/>
<xs:enumeration value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
它完美无瑕,它可以验证一切。问题是当它启动这个枚举Exception时,它会说:
cvc-enumeration-valid:对于枚举“{1}”,值“{0}”不是分面有效的。它必须是枚举值
是否有可能获得抛出异常的元素?至少得到元素类型?
感谢所有人的进步!
答案 0 :(得分:0)
最后,我没有使用ValidationEventCollector来获取错误但是处于低级别,而是使用了Validator并控制了错误处理程序使用的错误。现在我得到cvc-enumeration-valid错误并获取抛出它的类型。 这是一个例子:
url = FILE.class.getResource("xsd/file.xsd");
SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
schema = sf.newSchema(xsdUrl);
Validator validator = schema.newValidator();
final List<SAXParseException> exceptions = new LinkedList<SAXParseException>();
validator.setErrorHandler(new ErrorHandler() {
public void fatalError(SAXParseException exception) throws SAXException {
// TODO Auto-generated method stub
exceptions.add(exception);
}
public void error(SAXParseException exception) throws SAXException {
// TODO Auto-generated method stub
exceptions.add(exception);
}
});
bais = new ByteArrayInputStream(peticion.getBytes("UTF-8"));
//validate the xml against the xsd
validator.validate(new StreamSource(bais));
if(!exceptions.isEmpty()){
for(SAXParseException ex:exceptions){
validacionXml += ex.getMessage();
}
}
启动validate方法后,如果您希望获得启动错误的类型,errorHandler会归档所有错误,致命错误或警告。
感谢所有人