在xsd中使用RegEx来检查anyURI

时间:2014-05-04 22:55:09

标签: xml regex xsd

我在xml中有一个字符串

<DetailPageURL>http://www.amazon.com/exec/obidos/redirect?tag=bookmooch-20%26link_code=xm2%26camp=2025%26creative=165953%26path=http://www.amazon.com/gp/redirect.html%253fASIN=0001714600%2526tag=bookmooch-20%2526lcode=xm2%2526cID=2025%2526ccmID=165953%2526location=/o/ASIN/0001714600%25253FSubscriptionId=1AQVTEDADRW2C3ZDPCG2</DetailPageURL>

我想对此应用限制,它应始终以:

开头
http://www.amazon.com/exec/obidos/redirect?

这是我的代码:

<xsd:schema  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="DetailPageURL">

          <xsd:simpleType>

            <xsd:restriction base="xsd:anyURI">

              <xsd:pattern value="http://www.amazon.com/exec/obidos/redirect?[A-Za-z0-9]"/>

            </xsd:restriction>

          </xsd:simpleType>

                </xsd:element>
</xsd:schema>

它显然不起作用,因为我没有在其中添加=%-_等特殊字符。但我的问题是,如果我在我的模式中添加它:

<xsd:pattern value="http://www.amazon.com/exec/obidos/redirect?[A-Za-z0-9=-_%:/.]"/>

它会起作用吗?这是正确的做法吗?

3 个答案:

答案 0 :(得分:1)

这样的事情:

http://www\.amazon\.com/exec/obidos/redirect\?.+

应该足够了。正如Ian在评论中所说,以anyURI作为基本限制已经负责验证URL的一般结构,因此足以验证所需的前缀。

请务必记住.?等元字符。

答案 1 :(得分:1)

Michael Sperberg-McQueen定义了匹配的类型

中的不同风格的URI

http://www.w3.org/2011/04/XMLSchema/TypeLibrary-URI-RFC3986.xsd

http://www.w3.org/2011/04/XMLSchema/TypeLibrary-IRI-RFC3987.xsd

要查看这些复杂正则表达式的构造方式,请查看 这些文档在原始XML级别使用(例如)curl。

答案 2 :(得分:0)

如果您想确保以您指定的字符串开头的任何合法IRI,并且只有那些,对您的类型有效,您将需要

(1)导入Michael Kay的答案中提到的IRI类型,然后使用Matti Virkunen建议的模式(或更宽松的模式,用。替换。)来限制它们。

(2)使用类似

的模式

http://www\.amazon\.com/exec/obidos/redirect\?(([A-Za-z0-9\-\._~&#xA0;-&#xD7FF;&#xF900;-&#xFDCF;&#xFDF0;-&#xFFEF;&#x10000;-&#x1FFFD;&#x20000;-&#x2FFFD;&#x30000;-&#x3FFFD;&#x40000;-&#x4FFFD;&#x50000;-&#x5FFFD;&#x60000;-&#x6FFFD;&#x70000;-&#x7FFFD;&#x80000;-&#x8FFFD;&#x90000;-&#x9FFFD;&#xA0000;-&#xAFFFD;&#xB0000;-&#xBFFFD;&#xC0000;-&#xCFFFD;&#xD0000;-&#xDFFFD;&#xE1000;-&#xEFFFD;]|(&#37;[0-9A-Fa-f][0-9A-Fa-f])|[!$&amp;'()*+,;=:@])|[&#xE000;-&#xF8FF;&#xF0000;-&#xFFFFD;&#x100000;-&#x10FFFD;/?])*

通过手动扩展Michael Kay提到的类型中的实体iquery的定义来构建此模式。它表明,匹配URI或IRI的实际语法并不是那么难,尽管有时候有点单调乏味。

导入绝对URI-3986或绝对IRI-3987类型然后进一步限制它们更简单,更不容易出错。