微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java - XSD Validator:获取包含验证错误的元素的节点

如何解决Java - XSD Validator:获取包含验证错误的元素的节点

嗨,我在 Java 8 中工作,目前我正在尝试使用验证器 (javax.xml.validation.Validator) 使用 XSD 架构验证 XML。我的目标是能够检索包含验证错误的元素的节点。

在我的代码中,我使用了一个应用于验证器的 ErrorHandler。此外,我添加一个 getCurrentNode() 方法,该方法应该返回错误节点(validator.getProperty("http://apache.org/xml/properties/dom/current-element-node")。 在我的情况下, getProperty("---") 方法返回 null 而不是节点对象。我不明白为什么?我希望这不是因为我的一个组件的版本问题......比我知识渊博的人能理解出了什么问题吗?

我从以下回复获取代码Get parent element on XSD validation error .

public static void validateXMLSchema(URL xsd,String xml) throws SAXException,IOException {

    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = factory.newSchema(xsd);

    Validator validator = schema.newValidator();

    validator.setErrorHandler(new MyErrorHandler(validator));


    StreamSource ssXmlPath = new StreamSource(xml); //xml is a String represanting the path file
    validator.validate(ssXmlPath);

}

private static class MyErrorHandler implements ErrorHandler {
    private final Validator xsdValidator;

    public MyErrorHandler(Validator xsdValidator) {
        this.xsdValidator = xsdValidator;
    }
    @Override
    public void warning(SAXParseException exception) throws SAXException {
        System.out.println("Warning on node: " + getCurrentNode());
        System.out.println(exception.getLocalizedMessage());

    }

    @Override
    public void error(SAXParseException exception) throws SAXException {
        System.out.println("Error on node: " + getCurrentNode());
        System.out.println(exception.getLocalizedMessage());
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
        System.out.println("Fatal on node: " + getCurrentNode());
        System.out.println(exception.getLocalizedMessage());
    }


    private Node getCurrentNode() throws SAXNotRecognizedException,SAXNotSupportedException {
        // get prop "http://apache.org/xml/properties/dom/current-element-nodeb"
        // see https://xerces.apache.org/xerces2-j/properties.html#dom.current-element-node
        Node node = (Node)xsdValidator.getProperty(Constants.XERCES_PROPERTY_PREFIX + Constants.CURRENT_ELEMENT_NODE_PROPERTY);
        System.out.println(node.getLocalName() + ": " + node.getTextContent());
        return node;
    }
}

解决方法

已解决:为了能够使用节点,您必须使用文档对象,如果您在没有文档的情况下直接验证文件,则没有 DOM 构造并且 Xerces 找不到任何节点。

我必须有类似的东西:

DocumentBuilderFactory dbf
DocumentBuilderFactory.newInstance(org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.class.getName(),XSDTest.class.getClassLoader());
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new ByteArrayInputStream(xmlData));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?