XInclude Проверка схемы / пространства имен?
Я пытаюсь использовать XML Includes, чтобы помочь управлять большой структурой 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>
Мои проблемы почти очевидно связаны с пространствами имен, но я не знаю, как решить мою проблему.
4 ответа
Как уже указывал skaffman, XML Schema и 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-файл, применяя XInclude, а затем проверить этот файл.
Изменить: Вы можете использовать xmllint с --xinclude для проверки main.xml.
Я согласен с grantwparks - XInclude и XML Schema абсолютно могут использоваться вместе. Спецификации намеренно независимы друг от друга. Очевидно, что авторы XInclude хотели предоставить свободу обработки включений до проверки или после проверки.
В этой теме, посвященной speedreviews, обсуждается проблема, и ответ, который помог мне разобраться в этом вопросе, - это сообщение на xml.com со ссылкой на него:
Одним из наиболее распространенных вопросов о XInclude является то, как включение взаимодействует с валидацией, XSL-преобразованием и другими процессами, которые могут применяться к документу XML. Короткий ответ - это не так. XInclusion не является частью какого-либо другого процесса XML. Это отдельный шаг, который вы можете или не можете выполнять, когда и где это полезно для вас.
Например, рассмотрим проверку по схеме. Документ может быть проверен перед включением, после включения или обоими. Если вы проверяете документ до замены элементов xi:include, тогда схема должна объявлять элементы xi:include так же, как и любой другой элемент. Если вы проверите документ после замены элементов xi:include, то схема должна объявить элементы замены. Включение и проверка - это отдельные ортогональные процессы, которые можно выполнять в любом порядке, удобном в локальной среде.
Таким образом, все сводится к тому, чтобы заставить ваши XML-инструменты обрабатывать элементы xi:include перед проверкой (это то, что нужно в примере OP). Например, в XML-редакторе Eclipse есть параметр "Обрабатывать XML-включения" в XML -> XML-файлы -> Проверка (с использованием RSA 8.5), который необходимо включить, чтобы редактор мог обрабатывать xi:include before Проверка.
Энди
Я не думаю, что это вызвано несовместимостью между XInclude и схемой; мне кажется, что включение не обрабатывается перед проверкой. Таким образом, схема не допускает элемент include в main, только дочерний элемент. Если бы вы могли заставить ваш XML-процессор обрабатывать включения перед проверкой...
Я не думаю, что спецификации XML Schema и XInclude гарантированно совместимы друг с другом. Отдельные процессоры XML могут это позволить, а другие - нет.
Как правило, я бы сказал, что эти два не должны использоваться вместе.
PS Я не уверен, почему вы думаете, что это проблема пространства имен. Что дает вам такое впечатление?