Вопрос

Я пытаюсь использовать 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-процессор обрабатывать включения перед проверкой...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top