Я беспокоюсь только о том, существуют ли какие-то определенные теги в файлах XML, и не заботится о других тегах.Как мне составить XML-файл схемы? - PullRequest
2 голосов
/ 27 ноября 2011

Например, меня интересует, существуют ли в родительском теге «персона» некоторые необходимые дочерние теги, например «имя», «пол».И порядок появления этих «необходимых» тегов не фиксирован (но имена этих тегов фиксированы).

это нормально.

<person>
    <name>peter</name>
    <sex>male</sex>
</person>

это тоже нормально.хотя положения меняются

<person>
    <sex>male</sex>
    <name>peter</name>
</person>

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

<person>
    <name>peter</name>
    <age>23</age>
    <addr>abc</addr>
    <sex>male</sex>
</person>

и это не хорошо, потому чтоодин из необходимых тегов «имя» не существует.

<person>
    <age>23</age>
    <sex>male</sex>
</person>

Можете ли вы сказать мне, как составить XML-схему, чтобы проверить это?<xsd:sequence> ... кажется, не подходит для этой ситуации.

дополнение: На самом деле, помимо тегов "name", "sex", есть много (ниже 20) других "необходимых" тегов внутриродительский тег "персона".

Ответы [ 3 ]

2 голосов
/ 27 ноября 2011

Достичь этой модели контента очень просто, если элемент name должен стоять первым: вы определяете последовательность, состоящую из совпадающего имени частицы элемента, а затем (необязательной, повторяемой) подстановочной частицы (xs: any), совпадающей с чем угодно.

Сложнее добиться этого, если элемент name может появиться где угодно;проблема в том, что в XSD 1.0 модель содержимого оказывается неоднозначной, потому что, когда вы сталкиваетесь с элементом name, он соответствует как конкретной частице элемента для имени, так и подстановочному знаку.XSD 1.1 решает это аккуратно, допуская эту неоднозначность: элемент будет соответствовать конкретной частице в предпочтении подстановочному знаку.Таким образом, в XSD 1.1 вы можете написать

<xs:sequence>
  <xs:any minOccurs="0" maxOccurs="unbounded"/>
  <xs:element name="name"/>
  <xs:any minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>

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

0 голосов
/ 27 ноября 2011

Используйте последовательность, затем xsd: any

<xsd:element name="person">
    <xsd:complexType>
        <xsd:sequence>
        <xsd:element name="name" type="xsd:string" />
        <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

К сожалению, вы должны начать с элемента "name".

0 голосов
/ 27 ноября 2011

Возможно, вам нужно что-то вроде:

<xs:element name="name" type="xs:string" minOccurs="1" />

в спецификации сложного типа.Так что-то вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string" minOccurs="1" />
              <xs:any minOccurs ="0" maxOccurs ="unbounded" processContents="lax"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Первые два примера пройдены, но третий не пройден.

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