Как я могу определить файл xsd, который позволяет использовать неизвестные (подстановочные) элементы?

Я получаю сообщение xml с неизвестными элементами имен переменных... то есть они не предопределены...

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

например

<root>
    <service>my service</service>
    <resource>my resource</resource>
    <action>update</action>
    <parameters>
      <field1>value1</field1>
      <field2>value2</field2>
      <field3>value3</field3>
    </parameters>
</root>

то есть я не знаю, что будет передано как "параметры", я знаю только, что будет 0 или более элементов со значением, не допускается более глубокое размещение тэгов....

Я думал о чем-то вроде

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="service" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/>
      <xs:element name="resource" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/>
      <xs:element name="action" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/>
      <xs:element name="parameters">
        <xs:complexType>
          <xs:element name="*" maxOccurs="unbounded">
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

конечно, сложная часть

<xs:element name="*" maxOccurs="unbounded">

Можно ли сделать такую ​​вещь?

как я могу определить файл xsd, который проверяет такое сообщение?

-

Я проверил ссылку w3c на

http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#NCName

и он говорит:

"Лексическое пространство · NCName - это множество всех строк, которые · соответствуют · созданию NCName [Пространства имен в XML]".

так что это значит?

Кроме того... не могли бы вы посоветовать мне простой способ проверить соответствие с определением xsd?

Ответ 1

То, что вы хотите, является подстановочной частицей, подробности см. http://www.w3.org/TR/xmlschema-1/#Wildcards

Для этого вы можете использовать xs: any. Обратите внимание, что xs: element и xs: любой не может быть помещен непосредственно внутри xs: complexType. Вам нужен контейнер, похожий на последовательность или выбор.

Допустимая схема, которая обрабатывает подстановочные знаки, находится ниже:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="service" type="xs:string"/>
        <xs:element name="resource" type="xs:string"/>
        <xs:element name="action" type="xs:string"/>
        <xs:element name="parameters">
          <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
              <xs:any processContents="lax"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Ответ 2

Попробуйте следующее:

<xs:element name="parameters">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:any processContents="lax"></xs:any>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>