2009-09-22 2 views
3

Я пытаюсь создать xml-схему (xsd) для проверки xml-файла.<any> в XSD не работает?

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

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

Я хочу проверить, что a присутствует в файле, и 1 или более случаев b. Мне не интересно знать, что находится внутри 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> 

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

Редактировать: XmlSpy дает мне эту ошибку: Элемент 'c' не определен в DTD/Схеме.

ответ

2

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

<?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

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

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

+0

К сожалению, нет. XmlSpy дает мне эту ошибку: Элемент 'c' не определен в DTD/Schema. – Natrium

+0

после редактирования: все та же ошибка: XmlSpy дает мне эту ошибку: Элемент 'c' не определен в DTD/Schema. +1 за усилие. – Natrium

+0

Довольно уверен, что выше будет работать сейчас :) –

2

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

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

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

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

См. W3C spec для получения дополнительной информации.

+0

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

+0

XmlSpy не всегда понимает это правильно. Это ужасно, черт возьми. – skaffman