当前位置: 首页 > 知识库问答 >
问题:

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

江德海
2023-03-14

另外,我正在使用Java8,目前我正在尝试使用验证器(javax.XML.validation.validator)来验证XSD模式中的XML。我的目标是能够检索包含验证错误的元素的节点。

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;
    }
}

共有1个答案

袁康裕
2023-03-14

解决方案:为了能够使用节点,您必须使用Document对象,如果您在没有Document的情况下直接验证一个文件,那么就没有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));
 类似资料:
  • 我有以下带有unit&measure子元素的xml。 在SAXParseException中,我获得发生错误的行号。是否可以从行号中获取元素,然后获取其父元素?

  • 错误: TypeError:无法读取未定义的LoginForm c:/reactjs/hello-world/src/components/accountbox/LoginForm.js的属性“state”:23 2023 value={this.state.input.email}^24 onchange={this.handlechange}25 class=“form-control”26

  • 问题内容: 我有一个这样的清单: 我想获取T的.class。我该怎么做? 我的意思是: 编辑: 我尝试过: 当我调试它时 genericType 值: java.util.List 所以我认为这肯定是与该问题不同的问题:获取java.util.List的泛型类型,因为如果您使用声明了一个类并在以后的其他方法中分配了某些内容,则该类消失了。 问题答案: 您不能因为类型擦除。泛型类型在运行时未知(已被

  • 在寻找这个问题的答案时,我也遇到过类似的利用LINQ的方法,但是我还不能完全理解它们(并因此实现它们),因为我对它还不熟悉。基本上,我想说的是: 检查列表的任何元素是否包含特定字符串。 如果是,则获取该元素。 老实说,我不知道该如何着手做那件事。我能想出的是这个(当然不工作): 我知道为什么它不起作用: 不返回,因为它将检查列表的整个元素是否与我指定的字符串匹配 不会找到匹配项,因为它将再次检查与

  • 本文向大家介绍C#中获取BitArray中包含的元素数量,包括了C#中获取BitArray中包含的元素数量的使用技巧和注意事项,需要的朋友参考一下 要获取BitArray中包含的元素数量,代码如下- 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-

  • 当我输入错误的密码时,我想得到包含错误信息的div元素,这样我就可以测试登录成功,但我一直org.openqa.selenium.NoSuchElementExctive 我在网上搜索了一些解决方案,但到目前为止还没有一个有效。 我程序的其余部分运行良好——我可以获取电子邮件和密码元素并发送数据。我正在使用Selenium和java