Проверка схемы/пространства имен XInclude?
-
11-09-2019 - |
Вопрос
Я пытаюсь использовать XML-включения, чтобы управлять большой структурой XML, которая должна быть доступна как людям, так и машинам.
Но я испытываю множество проблем при попытке создать XML-файлы, которые можно проверить на соответствие существующей схеме.Вот упрощенный пример того, что я пытаюсь сделать.
Мой файл «main.xml» не проходит проверку.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xml - This fails to validate. -->
<ns1:main xsi:schemaLocation="http://www.example.com/main main.xsd"
xmlns:ns1="http://www.example.com/main"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xi="http://www.w3.org/2001/XInclude">
<name>String</name>
<xi:include href="child.xml"/> <!-- What I'm trying to do. -->
</ns1:main>
Файл «child.xml» отлично проверяется как отдельный файл.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Child.xml - This validates fine, as a standalone file. -->
<ns1:child xsi:schemaLocation="http://www.example.com/main main.xsd"
xmlns:ns1="http://www.example.com/main"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>String</name>
<age>String</age>
</ns1:child>
Вот моя схема:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xsd - My Simplified Schema -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://www.example.com/main"
targetNamespace="http://www.example.com/main">
<!-- Main Element (References Child) -->
<xs:element name="main">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element ref="ns1:child"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Child Element -->
<xs:element name="child">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Мои проблемы почти очевидно связаны с пространствами имен, но я не знаю, как решить мою проблему.
Решение
Как скаффман как уже отмечалось, XML-схема и XInclude несовместимы.
Сообщение об ошибке проверки от xmllint об этом ясно говорит:
main.xml:9: element include: Schemas validity error : Element '{http://www.w3.org/2001/XInclude}include': This element is not expected. Expected is ( {http://www.example.com/main}child ).
main.xml fails to validate
Цитируя Рекомендация W3C:«XInclude не определяет никакой связи с расширенными информационными наборами, созданными путем применения схемы XML.Такой расширенный информационный набор может быть предоставлен в качестве входного информационного набора, или такое дополнение может быть применено к информационному набору, полученному в результате включения».
Таким образом, вам следует сначала создать весь XML-файл, применив XIncludes, а затем проверить этот файл.
Редактировать:Вы можете использовать xmllint с --xinclude для проверки main.xml.
Другие советы
Я согласен с Grantwparks: XInclude и XML Schema абсолютно можно использовать вместе.Спецификации намеренно независимы друг от друга.Очевидно, авторы XInclude хотели предоставить свободу обработки включений до или после проверки.
Этот Тема о скорости обзора обсуждает проблему, и ответ, который помог мне понять суть вопроса, был этот пост на xml.com, цитирую оттуда:
Одним из наиболее распространенных вопросов о XINCLUDE является то, как включение взаимодействует с валидацией, преобразованием XSL и другими процессами, которые могут применяться к документу XML.Короткий ответ в том, что это не так.XInclusion не является частью какого-либо другого процесса XML.Это отдельный шаг, который вы можете выполнить или не выполнять, когда и где он полезен для вас.
Например, рассмотрим проверку по схеме.Документ может быть подтвержден до включения, после включения или оба.Если вы проверяете документ до замены XI: включить элементы, то схема должна объявить XI: включить элементы, как это будет объявить любой другой элемент.Если вы проверяете документ после замены XI: включить элементы, то схема должна объявить элементы замены.Включение и валидация являются отдельными, ортогональными процессами, которые могут быть выполнены в любом порядке, который удобен в местной среде
Итак, похоже, что все сводится к тому, чтобы ваши инструменты XML обрабатывали элементы xi:include перед проверкой (это то, что нужно для примера OP).Например, в редакторе XML Eclipse есть настройка «Обработка включений XML» в разделе XML -> Файлы XML -> Проверка (с использованием RSA 8.5), которую необходимо включить, чтобы редактор обрабатывал xi:include перед Проверка.
Энди
Я не думаю, что спецификации XML Schema и XInclude гарантированно совместимы друг с другом.Отдельные процессоры XML могут это позволить, но другие — нет.
Как правило, я бы сказал, что эти два понятия не следует использовать вместе.
P.S.Я не уверен, почему вы думаете, что это проблема пространства имен.Что производит у вас такое впечатление?
Я не думаю, что это вызвано несовместимостью XInclude и схемы;мне кажется, что включение не обрабатывается перед проверкой.Таким образом, схема не позволяет использовать элемент «include» в основном, а только «дочерний» элемент.Если бы вы могли заставить свой XML-процессор обрабатывать включения перед проверкой...