Есть ли способ обеспечить / сохранить порядок элементов XML в схеме XML? - PullRequest
9 голосов
/ 26 мая 2010

Рассмотрим следующую XML-схему:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    targetNamespace="http://www.example.org/library" 
    elementFormDefault="qualified" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:lib="http://www.example.org/library">

    <element name="library" type="lib:libraryType"></element>

    <complexType name="libraryType">
        <sequence>
            <element name="books" type="lib:booksType"></element>
        </sequence>
    </complexType>

    <complexType name="booksType">
        <sequence>
            <element name="book" type="lib:bookType" 
                     maxOccurs="unbounded" minOccurs="1"></element>
        </sequence>
    </complexType>

    <complexType name="bookType">
        <attribute name="title" type="string"></attribute>
    </complexType>
</schema>

и соответствующий пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<lib:library 
    xmlns:lib="http://www.example.org/library" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/library src/library.xsd ">

  <lib:books>
    <lib:book title="t1"/>
    <lib:book title="t2"/>
    <lib:book title="t3"/>
  </lib:books>

</lib:library>

Есть ли способ гарантировать сохранение порядка <lib:book .../> элементов? Я хочу быть уверен, что любой парсер, читающий XML, вернет книги в указанном порядке, то есть сначала книгу с title="t1", затем книгу с title="t2" и, наконец, книгу с title="t3".

Насколько я знаю, парсеры XML не обязаны сохранять порядок. Интересно, можно ли применить это через XML-схему? Одним из быстрых решений для меня было бы добавить атрибут index к элементу <lib:book .../> и делегировать сохранение порядка в приложение, читающее XML.

Комментарии? Предложения?

Ответы [ 4 ]

7 голосов
/ 09 ноября 2014

По словам Майкла Кея, который, кажется, является важной персоной в мире XML, порядок сохраняется.

Да, вы можете предполагать, что порядок элементов будет сохранен. Авторы спецификации XML не сказали этого явно, но они думали, что это очевидно. Парсер, который не сохраняет порядок, может быть технически совместимым, но никто никогда не будет его использовать; многие, многие приложения XML зависят от сохраняемого порядка, особенно те, которые используют XML для представления документов.

Источник: http://lists.xml.org/archives/xml-dev/201003/msg00045.html

2 голосов
/ 03 апреля 2011

Я знаю, что это очень старая версия, но, тем не менее, я также ищу способ гарантировать сохраненный порядок элементов XML.

Хотя все текущие парсеры могут сохранять порядок, определение XML никоим образом не требует этого, и будущие парсеры могут обрабатывать порядок совершенно иначе.

Похоже, что лучшее решение, которое существует сейчас, это дать элементам атрибут 'id', чтобы упорядочение можно было проверять в коде после анализа.

Ненавижу требовать, чтобы мои пользователи добавляли произвольный id = "1", id = "2" и т. Д., Когда порядок уже очевиден в файле XML, но, насколько я знаю, официального стандарта нет в XML для требования определенного порядка для повторяющихся элементов.

Обновление

Если вы используете .NET, у него есть свойство, которое вы можете установить, чтобы определить, в каком порядке он читает такие элементы. Итак, я думаю, если вы знаете, где будет анализироваться ваш XML, и синтаксический анализатор поддерживает принудительное применение элемента, упорядочивающегося так, как вам нужно, порядок может быть приведен в исполнение.

Однако если бы третье лицо приняло и попыталось воспроизвести ваши результаты с помощью своего собственного синтаксического анализатора, может возникнуть путаница, поскольку этот порядок настраивается где-то еще, а не в XML, поэтому никакая другая реализация синтаксического анализатора не будет знать, чтобы использовать этот заказ.

Таким образом, все это можно резюмировать так: (a) Порядок не может быть реализован внутри самой спецификации XML, но (b) Порядок может быть и часто обеспечивается большим количеством анализаторов XML.

2 голосов
/ 30 августа 2012

Как уже упоминалось в комментарии выше, xs:sequence определяет коллекцию ORDERED. Вот доказательство:

<xsd:complexType name="USAddress">
   <xsd:sequence>
    <xsd:element name="name"   type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="city"   type="xsd:string"/>
    <xsd:element name="state"  type="xsd:string"/>
    <xsd:element name="zip"    type="xsd:decimal"/>
   </xsd:sequence>
   <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
</xsd:complexType>

... Эти элементы должны называться name, street, city, State и zip, как указано значениями атрибутов name объявлений, , и элементы должны появляться в той же последовательности (порядке), в которой они объявлены .

Источник : W3C: Часть XML-схемы 0

1 голос
/ 26 мая 2010

Порядок элементов (в отличие от атрибутов) имеет большое значение в XML, и каждый мой анализатор сохранит его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...