如何在XML模式定义中表示IP地址?

3

我想在XML模式定义(XSD)中定义一种类型,以表示IPv4地址点分十进制表示法,这样在我的XML文件中:

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

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

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

被拒绝的原因是无效的。

2个回答

14

解决方法

在您的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>

1
答案是正确的,但没有考虑到在实际应用中可能会出现的一些边缘情况。在许多情况下,第一字节和第四字节不应为0,因此对于其中一个或两个字节使用类似于1[0-9]?[0-9]?|2[0-4][0-9]|25[0-5]的模式可能更理想。 - TedB
1
如果有其他读者阅读这篇有用的文章,特别是关于UDP多播地址模式规范的问题... ((22[4-9]|23[0-9]).)((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){2}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]) - Weedware

-1

可以通过轻微更新原始正则表达式来处理边缘情况:

([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}

根据正则表达式的前两个部分,将验证1至99的数字。

1 digit:  [1-9]
2 digits: [1-9][0-9]

这甚至不会匹配 127.0.0.1。 - svenhuebner
@svenhuebner:感谢您发现这个基本案例。我相应地更改了正则表达式,以便它可以捕获所有允许的值。 - CChris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接