如何通过失败的xsd验证获取元素和无效的xml文件

如何通过失败的xsd验证获取元素和无效的xml文件,第1张

如何通过失败的xsd验证获取元素无效的xml文件

下面是一种使用来实现用例的方法

ErrorHandler

MyErrorHandler

我建议您实施一个

ErrorHandler
,以维护对的引用,
XMLStreamReader
以便在
SAXParseException
发生时可以查询
XMLStreamReader
来获取有关该元素的信息。如果要在引发异常后停止分析,只需
SAXParseException
在每个方法的末尾重新抛出。

package forum11921190;import javax.xml.stream.XMLStreamReader;import org.xml.sax.*;public class MyErrorHandler implements ErrorHandler {    private XMLStreamReader reader;    public MyErrorHandler(XMLStreamReader reader) {        this.reader = reader;    }    @Override    public void error(SAXParseException e) throws SAXException {        warning(e);    }    @Override    public void fatalError(SAXParseException e) throws SAXException {        warning(e);    }    @Override    public void warning(SAXParseException e) throws SAXException {        System.out.println(reader.getLocalName());        System.out.println(reader.getNamespaceURI());        e.printStackTrace(System.out);    }}

演示版

您可以设置的一个实例

ErrorHandler
Validator

package forum11921190;import javax.xml.XMLConstants;import javax.xml.stream.*;import javax.xml.transform.stax.StAXSource;import javax.xml.transform.stream.StreamSource;import javax.xml.validation.*;public class Demo {    private static final StreamSource XSD = new StreamSource("src/forum11921190/schema.xsd");    private static final StreamSource XML = new StreamSource("src/forum11921190/input.xml");    public static void main(String[] args) throws Exception {        SchemaFactory factory=SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);        Schema schema = factory.newSchema(XSD);        XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(XML);        Validator validator = schema.newValidator();        validator.setErrorHandler(new MyErrorHandler(reader));        validator.validate(new StAXSource(reader));    }}

schema.xsd

以下是编写演示代码时使用的示例XML模式。

<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema"     targetNamespace="http://www.example.com"    xmlns:tns="http://www.example.com"    elementFormDefault="qualified">    <element name="root">        <complexType> <sequence>     <element name="foo" type="string"/>     <element name="bar" type="int"/> </sequence>        </complexType>    </element></schema>

input.xml

以下是一些示例输入。该

bar
元素具有无效的内容。

<?xml version="1.0" encoding="UTF-8"?><root xmlns="http://www.example.com">    <foo>valid</foo>    <bar>invalid</bar></root>

输出量

以下是运行演示代码的输出:

barhttp://www.example.comorg.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'invalid' is not a valid value for 'integer'.    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:423)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3188)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.elementLocallyValidType(XMLSchemaValidator.java:3103)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processElementContent(XMLSchemaValidator.java:3013)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2156)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:824)    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.endElement(ValidatorHandlerImpl.java:565)    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:261)    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.handleEndElement(StAXStream2SAX.java:295)    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.bridge(StAXStream2SAX.java:167)    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.parse(StAXStream2SAX.java:120)    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:674)    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:723)    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)    at com.sun.org.apache.xerces.internal.jaxp.validation.StAXValidatorHelper.validate(StAXValidatorHelper.java:94)    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:118)    at javax.xml.validation.Validator.validate(Validator.java:127)    at forum11921190.Demo.main(Demo.java:26)barhttp://www.example.comorg.xml.sax.SAXParseException: cvc-type.3.1.3: The value 'invalid' of element 'bar' is not valid.    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:423)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3188)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.elementLocallyValidType(XMLSchemaValidator.java:3104)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processElementContent(XMLSchemaValidator.java:3013)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2156)    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:824)    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.endElement(ValidatorHandlerImpl.java:565)    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:261)    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.handleEndElement(StAXStream2SAX.java:295)    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.bridge(StAXStream2SAX.java:167)    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.parse(StAXStream2SAX.java:120)    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:674)    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:723)    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)    at com.sun.org.apache.xerces.internal.jaxp.validation.StAXValidatorHelper.validate(StAXValidatorHelper.java:94)    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:118)    at javax.xml.validation.Validator.validate(Validator.java:127)    at forum11921190.Demo.main(Demo.java:26)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5104812.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存