【问题标题】:How can I define an XSD file that allows unknown (wildcard) elements?如何定义允许未知(通配符)元素的 XSD 文件?
【发布时间】:2009-06-03 08:34:48
【问题描述】:

我收到一条带有未知变量名称元素的 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的·词法空间·是所有字符串的集合·匹配·[Namespaces in XML]的NCName产生。

那是什么意思呢?
此外...您能推荐我一些简单的方法来测试是否符合 XSD 定义吗?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    你想要的是一个通配符,详情见 http://www.w3.org/TR/xmlschema-1/#Wildcards

    为此,您可以使用xs:any。请注意,xs:elementxs:any 不能直接放在 xs:complexType 内。你需要一个像 xs:sequencexs:choice 这样的容器。

    处理通配符的有效架构如下:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 2016-01-25
        • 1970-01-01
        • 2011-03-29
        相关资源
        最近更新 更多