如何解决在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 举报,一经查实,本站将立刻删除。