Java XSD проверки XML без пространства имен - PullRequest
10 голосов
/ 07 июня 2010

Я хочу проверить файл XML по схеме XSD. Корневой элемент файлов 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);

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

1 Ответ

2 голосов
/ 08 июня 2010

У вас есть две проблемы, о которых вам нужно позаботиться:

  1. Объявление пространства имен, используемого вашим документом.
  2. Помещение атрибута xsi:schemaLocation в файл для подсказки (!) , где находится схема.

Вы можете спокойно пропустить вторую часть, так как это действительно подсказка. Вы не можете пропустить первую часть. Пространство имен, объявленное в файле XML, сопоставляется со схемой. Важно, это:

<xml> ... </xml>

Разве не совпадает с этим:

<xml xmlns="urn:foo"> ... </xml>

Таким образом, вам нужно объявить свое пространство имен в документе XML, иначе оно не будет соответствовать вашей схеме, и вы получите эту ошибку.

...