如何定义允许未知(通配符)元素的xsd文件?

时间:2009-06-03 08:34:49

标签: xml 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的词汇空间”是所有字符串的集合,它们匹配了[XML格式的命名空间]的NCName生成。“

那是什么意思?

除此之外......您能否提出一些简单的方法来测试xsd定义的合规性?

2 个答案:

答案 0 :(得分:19)

您想要的是通配符粒子,详情请参阅 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 :(得分:1)

试试这个:

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