如何在XML架构定义中表示IP地址?

时间:2017-12-21 13:06:48

标签: xml xsd ip-address

我想在我的XML架构定义(XSD)中定义一个代表IPv4 address中的dot-decimal notation的类型,以便在我的XML中:

<Example>
    <Address>192.168.0.1</Address>
</Example>

将被验证为正确且不正确的值,例如:

<Example>
    <Address>192.268.0.1</Address>
</Example>

被视为无效。

1 个答案:

答案 0 :(得分:7)

解决方案

在XSD文件中使用以下类型定义:

<xs:simpleType name="IPv4Address">
  <xs:annotation>
    <xs:documentation>IPv4 address in dot-decimal notation. Equivalent to [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>

这只会在四个以点分隔的字段中的每一个中接受0到255的值。

模式说明

模式是:

((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])

这就是这个群组条款:

(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])

重复{3}三次,之后有一个\.点,然后又一次没有点。

|栏将该组子句分为三个替代匹配:

1?[0-9]?[0-9]匹配0到199之间的所有数字。
 2[0-4][0-9]匹配以2开头的三位数字,从200到249  25[0-5]匹配250到255

在架构中使用的示例

一旦定义,类型就可以在模式中使用,如下所示:

<xs:element name="Example">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Address" maxOccurs="1" type="IPv4Address" />
    </xs:sequence>
  </xs:complexType>
</xs:element>