我收到的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定义的合规性?
答案 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>