【问题标题】:Regular expression in XML schema definition failsXML 模式定义中的正则表达式失败
【发布时间】:2010-12-06 15:25:56
【问题描述】:

我在根据架构验证 XML 时遇到即将发生的错误。

Value 'this/is/a/simple/node-path' is not facet-valid 
with respect to pattern '^(\w+[\w\-/])+\w' for type 'PathModel'.

PathModel 类型的定义定义为simpleType,如下面的 sn-p 所示。被<path>this/is/a/simple/node-path</path>使用

<xs:simpleType name="PathModel">
  <xs:restriction base="xs:string">
    <xs:pattern value="^(\w+[\w\-/])+\w" />
  </xs:restriction>
</xs:simpleType>

预期结果列在此匹配表中。

this/is/a/simple/node-path       MATCHING
/this/is/a/simple/node-path      NOT MATCHING
this/is/a/simple/node-path/      NOT MATCHING
this/is/a/simple/nodep%th        NOT MATCHING (special characters)

出了什么问题?谢谢

【问题讨论】:

    标签: regex xsd


    【解决方案1】:

    删除前导 ^ 字符。

    <xs:simpleType name="PathModel"> <xs:restriction base="xs:string"> <xs:pattern value="(\w+[\w\-/])+\w" /> </xs:restriction> </xs:simpleType>

    这是您提供的集合中唯一有效的值:

    this/is/a/simple/node-path

    这应该对你有用(在我的 Eclipse IDE 中测试过)。

    原因可见,例如这里:http://www.regular-expressions.info/xml.html

    “与其他正则表达式风格相比,XML 模式风格在功能上非常有限。因为它仅用于验证整个元素是否匹配模式,而不是用于从大块数据中提取匹配项。XML 模式总是隐式地锚定整个正则表达式。 正则表达式必须匹配整个元素才能被认为是有效的元素。如果你有模式regexp,XML 模式验证器将以相同的方式应用它就像 Perl、Java 或 .NET 对模式 ^regexp$ 所做的那样。”

    【讨论】:

    • 非常感谢您提供正确的解决方案和解释,我自己应该知道 XML 模式正则表达式只匹配整个元素,而 ^$ 指令完全放错了位置并且没有必要!我希望我能不止一次地为你投票!
    【解决方案2】:

    据我所知,正则表达式似乎是有效的,并且应该根据 XSD 规范给出匹配表中显示的结果。将 Microsoft .NET Framework 2 与使用您的路径值和正则表达式的测试用例一起使用,我得到了完全符合您预期的结果。

    所以,您看到的可能原因:

    • 您正在使用的 XSD 实现中存在错误。
    • 您的代码未验证您认为正在验证的内容(尽管鉴于您看到的错误消息,这似乎不太可能)

    如果您告诉我们您正在使用什么实现并发布您的代码,我们可能会提供进一步的帮助。

    【讨论】:

    • 感谢您的回答。 Jiri Patera 的帖子解决了这个问题。
    • 啊...看来这个错误是在微软的 .NET 2 XSD 实现中,而不是你的 :-)。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2018-04-24
    • 2020-10-15
    • 2020-04-19
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多