XML 架构验证。项目数量不确定的无序列表
XML Schema validation. Unordered list with indeterminate number of items
我正在尝试创建一个 XML 模式以使用 1.0 版验证以下 XML。
规则是
- XML 在
<host>
标签下未排序
ip4
、present
和 hostname
是 必需的
comment
不需要
- 可以有任意数量的
hostname
个元素
example.xml
<?xml version = "1.0"?>
<host>
<comment>List of hosts</comment>
<hostname>nohostname1</hostname>
<hostname>nohostname2</hostname>
<ipv4>127.0.0.1</ipv4>
<present>no</present>
</host>
我目前有...
example.xsd
<?xml version = "1.0"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
<!-- any_string_type -->
<xs:simpleType name="any_string_type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- boolean_type -->
<xs:simpleType name="boolean_value_type">
<xs:annotation>
<xs:documentation>Boolean annotation [no/yes]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="no"/>
<xs:enumeration value="yes"/>
</xs:restriction>
</xs:simpleType>
<!-- ipv4 address type -->
<xs:simpleType name="ipv4_type">
<xs:annotation>
<xs:documentation>IPv4 address in dot-decimal notation [0-255].[0-255].[0-255].[0-255]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
</xs:restriction>
</xs:simpleType>
<!-- Start of host validation -->
<xs:element name = "host">
<xs:complexType>
<xs:all>
<xs:element name = "ipv4" type = "ipv4_type"/>
<xs:element name = "comment" type = "any_string_type" minOccurs="0"/>
<xs:element name = "present" type = "boolean_value_type"/>
<!-- I want to say maxOccures="unbounded" but that is not valid XML schema -->
<xs:element name = "hostname" type = "any_string_type"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
但我似乎无法绕过拥有任意数量的主机名元素。
首先,您的 XSD 甚至无效,</xs:schema>
之前的 <xs:element>
应该是 </xs:element>
但是,是的,您不能让主机名在 xsd:All 中出现多次。在 Visual Studio(使用 BizTalk SDK)中,我收到以下错误。
The {max occurs} of all the particles in the the {particle} of an all group must be 0 or 1.
你有两个选择。将主机更改为 minOccurs 为 3 且 maxOccurs 为无界的选择。但是,这不会强制您的 ip4、主机名和 present 至少出现一次并且仅出现一次 ip 和 present。
另一种选择是更改有效负载的结构,并在其下设置一个主机名节点,将主机名元素设置为 minOccurs="1" 和 maxOccurs="unbounded"
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="any_string_type">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:simpleType name="boolean_value_type">
<xs:annotation>
<xs:documentation>Boolean annotation [no/yes]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="no" />
<xs:enumeration value="yes" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ipv4_type">
<xs:annotation>
<xs:documentation>IPv4 address in dot-decimal notation [0-255].[0-255].[0-255].[0-255]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" />
</xs:restriction>
</xs:simpleType>
<xs:element name="host">
<xs:complexType>
<xs:all minOccurs="1" maxOccurs="1">
<xs:element name="ipv4" type="ipv4_type" />
<xs:element minOccurs="0" name="comment" type="any_string_type" />
<xs:element name="present" type="boolean_value_type" />
<xs:element name="hostnames">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="hostname" type="any_string_type" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
有效载荷看起来像这样并经过验证。
<?xml version = "1.0"?>
<host>
<comment>List of hosts</comment>
<hostnames>
<hostname>nohostname1</hostname>
<hostname>nohostname2</hostname>
</hostnames>
<ipv4>127.0.0.1</ipv4>
<present>no</present>
</host>
我正在尝试创建一个 XML 模式以使用 1.0 版验证以下 XML。
规则是
- XML 在
<host>
标签下未排序 ip4
、present
和hostname
是 必需的comment
不需要- 可以有任意数量的
hostname
个元素
example.xml
<?xml version = "1.0"?>
<host>
<comment>List of hosts</comment>
<hostname>nohostname1</hostname>
<hostname>nohostname2</hostname>
<ipv4>127.0.0.1</ipv4>
<present>no</present>
</host>
我目前有...
example.xsd
<?xml version = "1.0"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
<!-- any_string_type -->
<xs:simpleType name="any_string_type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- boolean_type -->
<xs:simpleType name="boolean_value_type">
<xs:annotation>
<xs:documentation>Boolean annotation [no/yes]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="no"/>
<xs:enumeration value="yes"/>
</xs:restriction>
</xs:simpleType>
<!-- ipv4 address type -->
<xs:simpleType name="ipv4_type">
<xs:annotation>
<xs:documentation>IPv4 address in dot-decimal notation [0-255].[0-255].[0-255].[0-255]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
</xs:restriction>
</xs:simpleType>
<!-- Start of host validation -->
<xs:element name = "host">
<xs:complexType>
<xs:all>
<xs:element name = "ipv4" type = "ipv4_type"/>
<xs:element name = "comment" type = "any_string_type" minOccurs="0"/>
<xs:element name = "present" type = "boolean_value_type"/>
<!-- I want to say maxOccures="unbounded" but that is not valid XML schema -->
<xs:element name = "hostname" type = "any_string_type"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
但我似乎无法绕过拥有任意数量的主机名元素。
首先,您的 XSD 甚至无效,</xs:schema>
之前的 <xs:element>
应该是 </xs:element>
但是,是的,您不能让主机名在 xsd:All 中出现多次。在 Visual Studio(使用 BizTalk SDK)中,我收到以下错误。
The {max occurs} of all the particles in the the {particle} of an all group must be 0 or 1.
你有两个选择。将主机更改为 minOccurs 为 3 且 maxOccurs 为无界的选择。但是,这不会强制您的 ip4、主机名和 present 至少出现一次并且仅出现一次 ip 和 present。
另一种选择是更改有效负载的结构,并在其下设置一个主机名节点,将主机名元素设置为 minOccurs="1" 和 maxOccurs="unbounded"
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="any_string_type">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:simpleType name="boolean_value_type">
<xs:annotation>
<xs:documentation>Boolean annotation [no/yes]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="no" />
<xs:enumeration value="yes" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ipv4_type">
<xs:annotation>
<xs:documentation>IPv4 address in dot-decimal notation [0-255].[0-255].[0-255].[0-255]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" />
</xs:restriction>
</xs:simpleType>
<xs:element name="host">
<xs:complexType>
<xs:all minOccurs="1" maxOccurs="1">
<xs:element name="ipv4" type="ipv4_type" />
<xs:element minOccurs="0" name="comment" type="any_string_type" />
<xs:element name="present" type="boolean_value_type" />
<xs:element name="hostnames">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="hostname" type="any_string_type" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
有效载荷看起来像这样并经过验证。
<?xml version = "1.0"?>
<host>
<comment>List of hosts</comment>
<hostnames>
<hostname>nohostname1</hostname>
<hostname>nohostname2</hostname>
</hostnames>
<ipv4>127.0.0.1</ipv4>
<present>no</present>
</host>