2015-10-29 2 views
2

Мое приложение проверяет в XML против XSD (, который находится в банке):Application проверяет XML против XSD: разрешить ссылку XSD в XML

private Document createAndValidate(Schema schema) throws IOException, SAXException, ParserConfigurationException { 
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
    documentBuilderFactory.setValidating(false); // DTD validation 
    documentBuilderFactory.setNamespaceAware(false); 
    documentBuilderFactory.setSchema(schema); 

    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
    documentBuilder.setErrorHandler(new SaxErrorHandler()); 

    return documentBuilder.parse(file.toFile()); 
} 

Это прекрасно работает до сих пор.

Но так как это проще создать XML с XSD (, который может быть в любом месте на локальном компьютере) ссылается, то XML начинается так:

<?xml version="1.0" encoding="UTF-8"?> 
<Definition 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="C:\definition_schema.xsd"> 

Теперь, когда мое приложение разбирает, что XML файл, он не может проверить из-за этого XSD справки:

CVC-комплекс-type.3.2.2: Атрибут 'XSI: noNamespaceSchemaLocation' является не разрешено появляться в 'Определение'

Я попытался добавить <xs:attribute name="xsi:noNamespaceSchemaLocation" type="xs:string" /> в элемент Definition, но это имя атрибута недействительно.

Я могу открыть XML-файл и удалить атрибут, прежде чем я (повторно) открою его и проведу его проверку. Но должно быть лучшее решение.

Как с этим справиться?

ответ

3

xmlns:xsi - это декларация пространства имен, поэтому измените на setNamespaceAware(true).

С его помощью установлено false, два атрибута - это только общие атрибуты, имя которых содержит :. С true: становятся разделителем между префиксом пространства имен (xmlns и xsi) и атрибутом namespace'd.

Вам также необходимо будет добавить атрибут xmlns="http://example.org/MyNamespace", соответствующий целевому пространству имен схемы.

+0

Отлично, спасибо! Моя схема не имеет пространства имен: '', поэтому мне не нужно добавлять атрибут, правильно? Теперь, с 'setNamespaceAware (true)', 'xsi' распознается как пространство имен. Но я не понимаю, почему атрибут 'xsi: noNamespaceSchemaLocation' теперь переносится XSD. Он до сих пор не определен. – halloei

+0

Определить пространство имен 'http: // www.w3.org/2001/XMLSchema-instance', но спецификация: XML-схема Часть 1: Структуры, раздел 2.6 [Отметка, связанная с схемой, в проверенных документах] (http://www.w3.org/TR/xmlschema-1/#Instance_Document_Constructions). – Andreas

Смежные вопросы