3

我已经开始使用 RelaxNG 来指定 XML 消息模式,并使用 PHP DOMDocument 来验证和解析传入的消息,但无法弄清楚如何定义文本节点以使其不能为空。示例架构:

<?xml version="1.0"?>
<element name="amhAPI" xmlns="http://relaxng.org/ns/structure/1.0">
    <element name="auth">
        <element name="validateUser">
            <element name="username">
                <text/>
            </element>

            <element name="password">
                <text/>
            </element>
        </element>
    </element>
</element>

但是,下面的消息正在被DOMDocument::relaxNGValidate方法验证为正确(因为relaxng将任意字符串[包括一个空字符串]与text模式匹配)并且等效于):

<?xml version="1.0"?>
<amhAPI>
    <auth>
        <validateUser>
            <username/>
            <password/>
        </validateUser>
    </auth>
</amhAPI>

因此,我必须为不应该为空的字段添加一堆检查和验证,如果验证器将它们识别为非空元素,则可以将其删除。

有没有办法强制非空文本?

4

3 回答 3

10

前面的解决方案并不总是很有效。如果将 minLength facet 设置为“1”,则接受一个空白字符(或一个换行符)。如果您使用该模式.*[\S]+.*,则不能插入任何换行符,但这仅适用于“用户名”和“密码”(参见上面的示例)。

正则表达式是正确的方法,但是将元素定义为非空更好的解决方案(对我而言)是通用模式:(.|\n|\r)*\S(.|\n|\r)*,因此您也可以在任何地方使用换行符。

于 2012-11-14T19:11:21.790 回答
4

如果您的 RELAX NG 验证器支持 XSD 数据类型(大多数都支持),那么您可以使用正则表达式来优化文本内容的约束:

<?xml version="1.0"?>
<element name="amhAPI" xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <element name="auth">
    <element name="validateUser">
      <element name="username">
        <data type="string">
          <param name="pattern">.+</param>
        </data>
      </element>
      <element name="password">
        <data type="string">
          <param name="pattern">.+</param>
        </data>
      </element>
    </element>
  </element>
</element>
于 2011-06-01T06:35:22.620 回答
0

或者,使用minLength似乎比正则表达式更直接和更干净。(这也需要 XSD 数据类型。)

<element name="amhAPI" xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <element name="auth">
    <element name="validateUser">
      <element name="username">
        <data type="string">
          <param name="minLength">1</param>
        </data>
      </element>
      <element name="password">
        <data type="string">
          <param name="minLength">1</param>
        </data>
      </element>
    </element>
  </element>
</element>
于 2012-02-09T05:33:34.210 回答