XML模式定义中的正则表达式失败

时间:2010-12-06 15:25:57

标签: regex xsd

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

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

类型PathModel的定义定义为simpleType,如下面的代码段所示。它由<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)

出了什么问题?谢谢

2 个答案:

答案 0 :(得分:5)

删除前导^字符。


<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$。“

答案 1 :(得分:-2)

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

所以,你所看到的可能原因是:

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

如果您告诉我们您正在使用的实施方式并发布您的代码,则可能会有所帮助。

相关问题