Проверка XML на соответствие схеме не выполняется в Java с пространством имен - PullRequest
0 голосов
/ 30 апреля 2019

Мне нужно написать код Java, который проверяет XML на соответствие схеме. Проверка не выполнена по какой-то причине, которую я не понимаю, за исключением следующего:

org.xml.sax.SAXParseException; cvc-elt.1: Cannot find the declaration of element 'root'

Схема:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"
    targetNamespace="http://www.example.com"
    xmlns="http://www.example.com"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root" type="rootType"/>
    <xs:simpleType name="rootType">
        <xs:restriction base="xs:integer"/>
    </xs:simpleType>
</xs:schema>

XML:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.com">1</root>

Java-код:

try (InputStream xmlStream = Main.class.getClassLoader().getResourceAsStream("a.xml");
        InputStream xsdStream = Main.class.getClassLoader().getResourceAsStream("a.xsd")) {
    DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document document = parser.parse(xmlStream);
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    StreamSource schemaFile = new StreamSource(xsdStream);
    Schema schema = factory.newSchema(schemaFile);
    Validator validator = schema.newValidator();
    validator.validate(new DOMSource(document));
}

Проверка завершается успешно, если я удаляю все ссылки на пространство имен "http://www.example.com". Что-то не так со схемой, XML или кодом?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вы должны включить пространства имен на фабрике компоновщика.

    DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
    fact.setNamespaceAware(true);
    DocumentBuilder parser = fact.newDocumentBuilder();
2 голосов
/ 30 апреля 2019

Вы должны настроить пространство имен DocumentBuilderFactory, используя метод setNamespaceAware().

...