我想迭代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)) ;
答案 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;
}