微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在RelaxNG中将元素定义为非空

如何解决在RelaxNG中将元素定义为非空

| 我已经开始使用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匹配带有ѭ1an模式的任意字符串[包括空字符串],并且等效于):
<?xml version=\"1.0\"?>
<amhAPI>
    <auth>
        <validateUser>
            <username/>
            <password/>
        </validateUser>
    </auth>
</amhAPI>
因此,我必须对不应该为空的字段进行大量检查和验证,如果验证程序将其识别为非空元素,则可以将其删除。 有没有强制非空文本的方法?     

解决方法

        如果您的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>
    ,        前面的解决方案并不总是能很好地工作。如果将minLength构面设置为\“ 1 \”,则将接受一个空格字符(或一个换行符)。如果使用模式
.*[\\S]+.*
,则不能插入任何换行符,但这仅对\“ username \”和\“ password \”有用(请参见上面的示例)。 正则表达式是正确的方法,但是将元素定义为非空是更好的解决方案(对我而言)是通用模式:
(.|\\n|\\r)*\\S(.|\\n|\\r)*
,因此您也可以在需要的地方使用换行符。     ,        另外,使用ѭ6似乎比正则表达式更直接,更干净。 (这也需要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>
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。