<any> в XSD не работает? - PullRequest
       20

<any> в XSD не работает?

3 голосов
/ 22 сентября 2009

Я пытаюсь создать xml-схему (xsd) для проверки xmlfile.

<a>
    <b>
        <c>...</c>
        <d>...</d>
    </b>
    <b>
        <c>...</c>
        <e>...</e>
            <d>...</d>
    </b>
<a>

1 a-элемент. Несколько b-элементов, которые имеют некоторый контент.

Я хочу проверить наличие a в файле и 1 или более вхождений b. Мне не интересно знать, что внутри б.

Вот что я попробовал:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="a">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="b" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="b">
        <xs:complexType>
            <xs:sequence>
                <xs:any minOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Я надеялся, что любой -элемент справится с магией, но это не так. Что я делаю не так?

редактирование: XmlSpy выдает мне эту ошибку: элемент 'c' не определен в DTD / Schema.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

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

Если вы хотите, чтобы элементы отсутствовали в схеме, вам нужно определить это следующим образом:

<xs:any minOccurs="1" processContents="lax"/>

Вы можете использовать «пропустить» вместо «слабый», что еще менее ограничительно.

Подробнее см. W3C .

2 голосов
/ 22 сентября 2009

Вам не нужны дополнительные 'b' в схеме, я думаю, что вы ищете это:

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

Это означает, что у вас есть <a> в качестве корневого узла, и он может содержать один или несколько <b> s

Редактировать: Извините, не прочитал полный вопрос - попробуйте выше!

Второе редактирование: Еще одна попытка выше!

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