Я хочу проверить XML-файл против схемы XSD. XML-файлы базируются, элемент не имеет никакого пространства имен или деталей xsi. Это не имеет никаких атрибутов так просто
.
Я попробовал следующий код из 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);
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);
}
}
У вас есть две отдельные проблемы, о которых вам нужно позаботиться:
xsi:schemaLocation
в файле, чтобы дать подсказку (!), где находится схема. Вы можете смело пропустить вторую часть, так как местоположение - это только подсказка. Первую часть пропускать нельзя. Пространство имен, объявленное в XML-файле, сопоставляется со схемой. Важно, что this:
<xml> ... </xml>
это не то же самое, что this:
<xml xmlns="urn:foo"> ... </xml>
Поэтому вам нужно объявить свое пространство имен в XML-документе, иначе оно не будет соответствовать вашей схеме, и вы получите эту ошибку.