在RelaxNG中将元素定义为非空

Hor*_*Kol 3 xml 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>
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)*,因此您还可以在任何地方使用换行符.