【问题标题】:XML schema restriction pattern for not allowing empty strings不允许空字符串的 XML 模式限制模式
【发布时间】:2013-12-11 00:13:19
【问题描述】:

在我的 XML 模式中,我有一个字符串类型的元素,我不想为空(如果它包含空格等,我也认为它是空的)

我应用了在http://blogs.msdn.com/b/neerajag/archive/2005/08/12/450723.aspx找到的限制

<xsd:restriction base = "xsd:string">
  <xs:minLength value="1" />
  <xs:pattern value=".*[^\s].*" />
</xsd:restriction>

该模式究竟做了什么,并将做我所期望的?

【问题讨论】:

    标签: regex xsd


    【解决方案1】:

    这不正是你想要的吗?

     <xs:restriction base="xs:token">
      <xs:minLength value="1"/>
     </xs:restriction>
    

    如果字符串仅包含空格(换行符、回车符、制表符、前导和尾随空格),处理器将删除它们,因此验证将失败;如果还有其他内容,则验证将成功。 (但请注意:两个或多个空格的内部序列将被删除 - 请确保您对此表示满意)

    【讨论】:

    • 它有效,但它有效只是因为它使用: 限制。所以没有其他魔法。
    【解决方案2】:

    图案:

    • 零个或多个字符.*. 匹配任何字符)。
    • 匹配不在所列字符集中的内容。 \s 是空格,所以[^\s] 是“匹配不是空格的东西。匹配中的初始^ 否定这些字符中的任何一个的正常匹配。
    • 零个或多个字符。

    【讨论】:

    • 它拒绝带有回车字符的文本。为什么?
    • @jlp: ". 匹配任何字符" 是快速版本。完整版包含一个注释,根据正则表达式引擎,它可能与换行符默认情况下不匹配。尝试将.* 替换为[.\s]*,因为\s 匹配包括换行符和回车符。
    • 你能写出符合问题要求的模式吗?
    • @jlp:什么要求?问题是“这种模式是什么意思?”。
    • 不为空的字符串(只有空格和换行符也表示为空)
    【解决方案3】:

    我不知道是否仍然有用,但我找到了比第一次发布的更好的模式。这里是:

    <xs:simpleType name="nonEmptyString">
        <xs:restriction base="xs:string">
            <xs:pattern value="(\s*[^\s]\s*)+"></xs:pattern>
        </xs:restriction>
    </xs:simpleType>
    

    使用 Eclipse,似乎工作正常。

    【讨论】:

    • 我刚刚写了 5 个单元测试测试 a) 空字符串 b) 单个空格 c) d) 包含新行的多个空格 e) 包含多个新行的多个空格。它适用于所有这些情况,所以我建议这对任何需要它的人来说都是一个很好的解决方案! :) 干得好。
    • 这是适用于我的用例 +1 的所有答案中唯一的解决方案
    • 这个效果很好,与线程海报示例相比的不同之处在于它使用 \s* 而不是 .*, 。不匹配换行符!
    【解决方案4】:

    查看帖子“不允许空字符串的模式”的主题,该主题仍未得到答复。您可以使用&lt;xsd:whiteSpace value="collapse" /&gt; 标签来禁止空格

    whiteSpace 约束设置为"collapse",它将执行以下操作

    1. 删除所有空白字符,包括换行符、制表符、 空格,回车
    2. 删除了前导和尾随空格
    3. 多个空格被缩减为一个空格

    参考:W3C whiteSpace

    【讨论】:

    • 您对“collapse”值的描述似乎不正确;尤其是数字 1。数字 1 中唯一看起来正确的部分是数字 2 中重复的部分。但是考虑到您的来源(w3schools),我可以理解您为什么会感到困惑; W3Schools 是很多东西的低质量资源。 (见w3fools.com
    • @Andrew 感谢您的指点。我还提到了 W3C 作为参考 W3C whiteSpace - w3.org/TR/xmlschema-2/#rf-whiteSpace Point 2,3 似乎是完全正确的。虽然没有提到第 1 点,但它也在工作 更新了参考
    • 参考资料的出色更新。我对#1 仍然有点不确定(正如你所指出的,#2、3 绝对正确)。在 #1 上,它不会将这些类型的空格转换为空格,而不是简单地删除它们吗? (然后,随后,将所有空间折叠成一个空间......)
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2011-08-14
    相关资源
    最近更新 更多