Ale*_*mes 11 java xml validation xsd
我想针对XSD架构验证XML文件.XML文件根元素没有任何名称空间或xsi详细信息.它没有属性<root>.
我从http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html尝试了以下代码,但没收到任何运气
cvc-elt.1: Cannot find the declaration of element 'root'
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
File schemaFile = new File("schema.xsd");
Schema xsdScheme = factory.newSchema(schemaFile);
Validator validator = xsdScheme.newValidator();
Source source = new StreamSource(xmlfile);
validator.validate(source);
Run Code Online (Sandbox Code Playgroud)
xml通过包含的命名空间标头等(通过xmlspy添加)验证正常,但我认为可以声明xml命名空间而无需手动编辑源文件?
编辑和解决方案:
public static void validateAgainstXSD(File file) {
try {
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
File schemaFile = new File("path/to/xsd");
Schema xsdScheme = factory.newSchema(schemaFile);
Validator validator = xsdScheme.newValidator();
SAXSource source = new SAXSource(
new NamespaceFilter(XMLReaderFactory.createXMLReader()),
new InputSource(new FileInputStream(file)));
validator.validate(source,null);
} catch (Exception e) {
e.printStackTrace();
}
}
protected static class NamespaceFilter extends XMLFilterImpl {
String requiredNamespace = "namespace";
public NamespaceFilter(XMLReader parent) {
super(parent);
}
@Override
public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
if(!arg0.equals(requiredNamespace))
arg0 = requiredNamespace;
super.startElement(arg0, arg1, arg2, arg3);
}
}
Run Code Online (Sandbox Code Playgroud)
您有两个需要注意的问题:
xsi:schemaLocation在文件中放置一个属性以给出架构所在位置的提示(!) 。您可以安全地跳过第二部分,因为该位置实际上只是一个提示。您不能跳过第一部分。XML 文件中声明的命名空间与架构相匹配。重要的是,这个:
<xml> ... </xml>
Run Code Online (Sandbox Code Playgroud)
和这个不一样:
<xml xmlns="urn:foo"> ... </xml>
Run Code Online (Sandbox Code Playgroud)
因此,您需要在 XML 文档中声明您的命名空间,否则它将与您的架构不对应,并且您将收到此错误。
| 归档时间: |
|
| 查看次数: |
10293 次 |
| 最近记录: |