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

Я получаю сообщение 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?

Ответы [ 2 ]

19 голосов
/ 06 июня 2009

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

Для этого вы можете использовать xs: any. Обратите внимание, что xs: element и xs: any нельзя размещать непосредственно внутри 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>
1 голос
/ 03 июня 2009

Попробуйте это:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...