2009-06-03 40 views
11

我收到一个带有未知变量名称元素的xml消息...也就是说,它们没有被预定义...如何定义允许未知(通配符)元素的xsd文件?

我只知道可以有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文件?

-

我在

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

检查W3C参考,并说:

“的词汇··NCName来的空间是一组中的所有字符串,其·赛·[名称空间的XML]的NCName生成。“

那么这是什么意思?

此外...你能推荐一些简单的方法来测试遵从xsd定义吗?

回答

19

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

要做到这一点,你可以使用的xs:任何。请注意,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

试试这个:

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