验证xml。获取抛出cvc-enumeration-valid的元素名称

时间:2016-01-11 09:11:50

标签: xml validation xsd

大家早上好!

我正在以这种方式对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}”不是分面有效的。它必须是枚举值

是否有可能获得抛出异常的元素?至少得到元素类型?

感谢所有人的进步!

1 个答案:

答案 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会归档所有错误,致命错误或警告。

感谢所有人