我已经开始使用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>
Run Code Online (Sandbox Code Playgroud)
但是,DOMDocument :: relaxNGValidate方法正在验证下面的消息是正确的(因为relaxng 匹配任意字符串 [包括空字符串 ]与text模式)并且相当于):
<?xml version="1.0"?>
<amhAPI>
<auth>
<validateUser>
<username/>
<password/>
</validateUser>
</auth>
</amhAPI>
Run Code Online (Sandbox Code Playgroud)
因此,我必须为不应该为空的字段添加一堆检查和验证,如果验证器将它们标识为非空元素,则可以删除这些字段.
有没有办法强制非空文本?
小智 10
前面的解决方案并不总是很好.如果将minLength构面设置为"1",则接受一个单个空白字符(或一个换行符).如果您使用该模式.*[\S]+.*,则无法插入任何换行符,但这仅适用于"用户名"和"密码"(请参阅上面的示例).
正则表达式是正确的方法,但是要将元素定义为非空,更好的解决方案(对我来说)是通用模式:(.|\n|\r)*\S(.|\n|\r)*,因此您还可以在任何地方使用换行符.