【问题标题】:XML schema regular expression is Perl-ish.Why is this is allowed?XML 模式正则表达式是 Perl-ish。为什么允许这样做?
【发布时间】:2017-09-08 14:21:37
【问题描述】:

我正在处理某种交换格式的 XSD 文件。标题说我们存在符合XML schema(2001 年的一个,所以是 1.0)的文档,并且这是文档的 0.4.0 版本。此外,注释表明该文档是由 Altova XMLSpy v2015 创建的:

<!-- W3C Schema generated by XMLSpy v2015 rel. 3 (x64) 
     (http://www.altova.com)  Payment Instructions -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="0.4.0">

这个文件定义了一个类型来描述IBANs,这是一个xs:string被限制匹配某个正则表达式:

<xs:simpleType name="IBANType">
   <xs:restriction base="xs:string">
      <xs:pattern value="^$||([A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{1,30})||(\.)"/>
   </xs:restriction>
</xs:simpleType>

现在给出的正则表达式似乎不符合相当受限的standard XML Schema regex。特别是,它使用^$ 和重复模式{x,y} (更正:重复模式可以在the W3C XSD primer 中找到。这使得正则表达式成为有效的XSD 正则表达式,尽管接受字符串^$ 并且使用了太多|。) 实际上,如果||| 替换,我们会得到Perl regex

  1. ^$ == "空字符串"
  2. |
  3. ([A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{1,30}) == 2 x alpha、2 x digit、1-30 x alpha 或数字
  4. |
  5. (\.) == 一个点(分组括号是多余的)

这确实与 IBAN 格式匹配,并涵盖了两种特殊情况“缺失数据”和“缺失数据,由点替换”(只需将元素排除在外,这两种情况都会更优雅地处理,但这不在我的问题范围)。

人们预计 XSD 验证器的实现会抱怨这样的正则表达式,但没有。通过处理 XSD 文件,我从 javax.xml.validation.SchemaFactory 获得了有效的 javax.xml.validation.Validator:没问题,没有警告,而且验证器似乎正确地使用了该正则表达式来检查输入。

这怎么可能?这里遵循什么规范,为什么 Altova XMLSpy 会生成这样的表达式?实现是不是很宽容,说“这看起来像一个 Perl 正则表达式,所以我会这样处理,看我不在乎”?

【问题讨论】:

  • @version 属性表示“这是此架构的 0.4.0 版本”,而不是“此架构符合 XSD 规范的 0.4.0 版本”。
  • @Michael 谢谢你,更正文字。

标签: regex xml validation xsd


【解决方案1】:

我认为这是一个有效的 XSD 正则表达式 - 但它可能并不代表作者的意图

^$||([A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{1,30})||(\.)

^$ 是普通字符,所以匹配字符串“^$”

A||B 表示 A 或无或 B

XSD 正则表达式方言中允许使用{2,2}

\. 匹配一个“.”人物

【讨论】:

  • '.' 的匹配字符是预期的。我将不得不测试字符串 '^$ ' 是否被验证器接受。你是对的,范围表达式 {2,2} 是允许的。我没有勇气通过 W3C XSD 规范,但它是listed in the primer。我需要更正问题文本。
  • 终于开始测试了。 XSD 接受字符串^$ 作为IBANType 的实例。哎呀。
【解决方案2】:

一些 XML Schema 验证处理器,为方便起见,将正则表达式的解析和解释外包给第三方库,“按原样”使用。这导致他们在这方面没有完全遵循规范。

即使处理器更加宽松并接受 XML Schema 正则表达式语言的超集,强烈建议在设计模式时坚持 XML Schema 规范允许的内容并避免使用额外的功能。这可确保其他 XML Schema 处理器能够以相同的方式接受和处理该模式(互操作性)。

如果一个实现不接受 XML Schema 允许的正则表达式,或者以不同方式解释它们,那么问题就更大了,因为这会导致与 100% 兼容的模式的互操作性问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2013-05-06
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多