Разрешены ли круговые группы схемой XSD?

Для этого xml:

<elem1 xmlns="http://www.fixprotocol.org/ns/fast/t/1.0">
 <elem2>
   <elem2/>
 </elem2>
</elem1>

У меня есть эта схема, которая, кажется, отлично проверяется на службе проверки схемы w3, и схема отлично проверяет приведенный выше XML. К сожалению, xsd.exe и некоторые другие инструменты сообщают об ошибке. Это правильно? Запрещены ли круговые групповые ссылки схемой XML? Спасибо!

Обновление: схема не моя, изменить не могу :(

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.fixprotocol.org/ns/fast/t/1.0" xmlns:t="http://www.fixprotocol.org/ns/fast/t/1.0">

  <xs:element name="elem1">
    <xs:complexType>
      <xs:group ref="t:grp1" />
   </xs:complexType>
  </xs:element>

  <xs:group name="grp1">
    <xs:sequence>
      <xs:group ref="t:grp2" />
    </xs:sequence>
  </xs:group>

  <xs:group name="grp2">
    <xs:sequence>
      <xs:element minOccurs="0" name="elem2">
        <xs:complexType>
          <xs:group ref="t:grp1" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:group>

</xs:schema>

person Yuri Astrakhan    schedule 29.10.2010    source источник
comment
В чем ошибка xsd.exe?   -  person David Norman    schedule 02.11.2010
comment
Ошибка: Ошибка создания классов для схемы 'tmp'. - Группа 'grp2' из targetNamespace='...' имеет недопустимое определение: циклическая ссылка на группу. Если это ошибка XSD, я могу попытаться связаться с ответственной за нее организацией и сообщить им об ошибке. Если нет, я попытаюсь найти альтернативный генератор кода или попытаться исправить ошибку в xsd.exe моно (который зависает, а не показывает ошибку).   -  person Yuri Astrakhan    schedule 03.11.2010


Ответы (4)


Этот вопрос связан со многими недавними вопросами, в которых говорится об одной и той же проблеме: круговые группы и Microsoft xsd.exe, поэтому я думаю, что на него следует ответить, хотя он довольно «старый».

Путаница вызвана тем, что квалифицируется как круговая группа. Согласно разделу 3.8.6 спецификации XSD:

«Круговые группы запрещены. То есть внутри {частиц} группы не должно быть ни на какой глубине частицы, {член} которой является самой группой».

Исходя из вышесказанного, ваш пример не является круговой группой, поскольку сама группа не полагается на себя как на частицу. Ваша схема действительна.

Это круговая группа:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns="http://www.fixprotocol.org/ns/fast/t/1.0" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.fixprotocol.org/ns/fast/t/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="elem1">
        <xsd:complexType>
            <xsd:group ref="grp1"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:group name="grp1">
        <xsd:sequence>
            <xsd:choice>
                <xsd:group ref="grp1"/>
            </xsd:choice>                       
        </xsd:sequence>
    </xsd:group>
</xsd:schema>

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

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema xmlns="http://www.fixprotocol.org/ns/fast/t/1.0" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.fixprotocol.org/ns/fast/t/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:annotation>
        <xsd:documentation xmlns="">Generated from "Set1" under "Release2"</xsd:documentation>
    </xsd:annotation>

    <xsd:complexType name="grp1">
        <xsd:sequence>
            <xsd:element minOccurs="0" name="elem2" type="grp1"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="elem1" type="grp1"/>
</xsd:schema> 

Также «забавно» видеть, что следующая схема действительно работает с xsd.exe:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema xmlns="http://www.fixprotocol.org/ns/fast/t/1.0" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.fixprotocol.org/ns/fast/t/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:annotation>
        <xsd:documentation xmlns="">Generated from "Set1" under "Release2"</xsd:documentation>
    </xsd:annotation>
    <xsd:element name="elem1">
        <xsd:complexType>
            <xsd:group ref="grp1"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:group name="grp1">
        <xsd:sequence>
            <xsd:element minOccurs="0" name="elem2">
                <xsd:complexType>
                    <xsd:group ref="grp1"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:group>
</xsd:schema>

С точки зрения экземпляра XML все три допустимые схемы эквивалентны.

person Petru Gardea    schedule 14.09.2015

Проблема, вероятно, в том, что используемые вами инструменты не поддерживают все возможности, поддерживаемые спецификацией схемы XML. Конечно, xsd.exe не поддерживает все. Спецификация гигантская, и не стоит предоставлять отображения всего, что она поддерживает, в язык программирования, особенно когда некоторые вещи просто не очень хорошо отображаются.

Чтобы обойти это, вы можете попытаться создать набор классов C#, которые имитируют xml, который вы хотите создать, а затем запустить xsd.exe для этих классов, чтобы создать xsd. Вероятно, существует какая-то другая конструкция XML-схемы, которая поддерживает то, что вы хотите.

person David Norman    schedule 01.11.2010
comment
Да, Дэвид, это проблема, но мне нужно выяснить, разрешено ли это спецификацией XSD или нет, и, возможно, помочь команде Mono решить эту проблему (их инструмент xsd.exe зависает). Я бы хотел изменить схему, но как обычно - это общедоступная схема организации, а не моя :). Я попытался прочитать спецификацию, но меня очень смутил их язык, поэтому я надеялся, что кто-то знает ответ. - person Yuri Astrakhan; 02.11.2010

Это юридическая схема. Проблема в том, что xsd пытается обойти все зависимости. Версия MS препроцессирует схему и расширяет все группы. Из-за циклической зависимости такое расширение было бы бесконечным, поэтому оно завершается с ошибкой. С версией Mono возможны два сценария:

  1. Он пытается пройти по дереву зависимостей и попадает в бесконечный цикл.
  2. Он пытается развернуть все группы и попадает в бесконечный цикл.

Это только мое предположение. Я никогда не видел реальных исходных кодов Mono xsd.

person CodeRipper    schedule 09.12.2010
comment
Ответ Microsoft по адресу connect.microsoft.com/VisualStudio/feedback/details/637855 было то, что это недействительная схема. Не могли бы вы уточнить? Я подозреваю, что они ошибаются, но я не уверен. - person Yuri Astrakhan; 13.05.2011

Я не знаю о группах, но XSD.exe поддерживает круговые элементы:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Class1" nillable="true" type="Class1" />
  <xs:complexType name="Class1">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" name="child" type="Class1" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
person Sal    schedule 07.04.2017