Проверка схемы XML - PullRequest
       14

Проверка схемы XML

1 голос
/ 24 августа 2009

Почему эта XML-схема не проверяется? Visual Studio сообщает, что тег simpleContent является недопустимым тегом. Если я затем удаляю атрибут, он говорит, что базовый тип для моего ограничения не определен в http://www.w3.org/2001/XMLSchema

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >    
    <xs:complexType name="Person">
        <xs:attribute name="isProcessed" type="xs:boolean" />
        <xs:simpleContent>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Male" />
                <xs:enumeration value="Female" />        
            </xs:restriction>
        </xs:simpleContent>    
    </xs:complexType>
</xs:schema>

@ marc_s - я пытался нажать кнопку кода, но она скрывала весь xml в области предварительного просмотра. Я положил туда место, чтобы оно появилось.

Конечный результат XML должен выглядеть следующим образом

<person isprocessed="True" >Male</person>

Ничего особенного. По сути, я пытаюсь создать simpleType с атрибутом. Но если я правильно понимаю W3, атрибуты могут быть применены только к complexTypes. Поэтому я попытался создать complexType с простым содержимым внутри.

Ответы [ 2 ]

1 голос
/ 24 августа 2009

Что ж, согласно учебнику XML-схемы W3 Schools , то, что вы пытаетесь сделать, недопустимо в контексте схемы XML.

Вы можете применить <xs:restriction> только к <xs:simpleType>, но не к <xs:simpleContent> внутри <xs:complexType>.

A <xs:simpleContent> может содержать <xs:extension> для расширения базового типа - но не ограничение.

Таким образом, вопрос на самом деле: что вы пытаетесь достичь здесь ?? Какова цель, как должен выглядеть XML, который вы хотите проверить ??

Марк

ОБНОВЛЕНИЕ:

ОК, чтобы достичь того, чего вы хотите, попробуйте это - определите сложный тип (для того, чтобы иметь атрибут), который содержит простое содержимое (чтобы вы могли иметь строковое значение) и используйте расширение xs: содержание - не хз: ограничение. Таким образом, в основном вы определяете сложный тип, который расширяет содержимое простой строки и добавляет атрибут:

      <xs:complexType>
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute name="isprocessed" type="xs:string" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>

Чтобы сделать это, я просто создал файл «test.xml» с требуемым содержимым, добавил искусственный <root>...</root> (то есть это действительный XML-документ), а затем запустил Microsoft xsd.exe инструмент для создания из него схемы XML (вы можете сделать то же самое в Visual Studio 2008, тоже - откройте файл XML и выберите «XML> Создать схему» из меню).

Надеюсь, это поможет!

1 голос
/ 24 августа 2009

Я предлагаю разбить ваш тип на два отдельных типа.Это понятнее и правильнее:

<xs:complexType name="Person">
    <xs:simpleContent>
        <xs:extension base="Gender">
            <xs:attribute name="isProcessed" type="xs:boolean" />
        </xs:extension>
    </xs:simpleContent>    
</xs:complexType>

<xs:simpleType name="Gender">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Male" />
        <xs:enumeration value="Female" />        
    </xs:restriction>
</xs:simpleType>

Я не уверен, как выразить это как определение одного типа.

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