迭代并验证DOM节点 - java

时间:2013-02-07 17:29:42

标签: java validation dom

我想迭代XML文件中的所有子节点。如果值验证失败,那么我想将/ clone节点附加到新的xml文档。对以下代码的任何建议?

for(Node childNode = node.getFirstChild(); childNode!=null;)
{
   Node nextChild = childNode.getNextSibling();
   //validate here and append or
   //clone to new xml file if false
   childNode = nextChild;
}

我创建了验证器实例,它确实验证了每个节点。如何找出哪个节点失败(true,false)然后追加。我可以使用布尔值进行失败验证,然后附加到新文档吗?

// creating a Validator instance 
Validator validator = schema.newValidator(); 
Validator.validate(new DOMSource(childNode)) ; 

1 个答案:

答案 0 :(得分:-1)

遇到了同样的问题,并在此处找到了验证的解决方案 http://blog.bigpixel.ro/2011/08/validating-xml-node-against-a-xsd-schema/

所有归功于博客的作者

编辑:Sry,匆忙。

这里的想法是:javax.xml.validation.Validator适用于整个文档,而不适用于单个节点。因此,首先将节点转换为其String表示形式,然后转换为可以评估的Document。

虽然博客条目主要显示了Dom2String转换,但我将在这里向您展示更有趣的部分,其中针对XSD进行验证(与博客作者有点不同,因为我没有想要捕获所有可能的异常)

 static public boolean validateNodeAgainstXSD(Node node, String schemaFile) throws TransformerException,
    IOException {
    // check if the arguments are valid
    if (node == null || schemaFile == null || schemaFile.isEmpty()) {
        logger.error("Invalid Argument(s)");
        return false;
    }

    //Create Stream from the XSD file and an empty Schema object
    InputStream istream = new FileInputStream(new File(schemaFile));
    String schemaLang = "http://www.w3.org/2001/XMLSchema";
    SchemaFactory factory = SchemaFactory.newInstance(schemaLang);
    Schema schema;
    try {
        // configure the Schema objeczt with your XSD
        schema = factory.newSchema(new StreamSource(istream));
        // get your Validator
        Validator validator = schema.newValidator();
        logger.debug("Node content to be validated: {0}", domNodeToString(node));
        //get your Node as Stream
        StringReader r = new StringReader(domNodeToString(node));
        //throws SAXException iff the validation fails 
        validator.validate(new StreamSource(r));
    } catch (SAXException e) {
        logger.warn("SAXException caught " + e.getMessage());
        return false;
    }
    return true;

}