使用Relax NG验证XML节点是否为空并且没有空白区域

时间:2012-10-25 18:01:28

标签: xml validation whitespace relaxng

我想使用Relax NG模式来验证XML文件。作为验证的一部分,我想确保一组节点中没有空白区域。例如,我想要前两个<emptyCheck>节点进行验证,但第三个和第四个节点在此示例中失败:

<?xml version="1.0" encoding="UTF-8"?>
<testRoot>
    <emptyCheck/>
    <emptyCheck></emptyCheck>
    <emptyCheck> </emptyCheck>
    <emptyCheck>x</emptyCheck>
</testRoot>

以下Relax NG Schema几乎可以使用。上面的示例XML对于<emptyCheck>的第四个实例失败,但对第三个实例则失败。

<?xml version="1.0" encoding="UTF-8"?>
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0">
    <start>
        <element name="testRoot">
            <oneOrMore>
                <element name="emptyCheck">
                    <empty/>
                </element>
            </oneOrMore>
        </element>
    </start>
</grammar>

我认识到在大多数XML处理中,只有空格的节点并不重要。我仍然想解决这个问题,所以我可以强制执行编码风格指南。那么,有没有办法设置一个Relax NG模式,这样当一个节点完全为空时,一个节点是否只有一个空格呢?

1 个答案:

答案 0 :(得分:3)

RELAX NG似乎很古怪允许声明为空的元素包含空格,尽管决定有rational basis

无论如何,如果您的RELAX NG验证器支持XSD数据类型(大部分都是),那么您可以通过指定元素内容必须是零长度字符串来使用它们进一步限制允许的元素内容:

<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>
    <element name="testRoot">
      <oneOrMore>
        <element name="emptyCheck">
          <data type="string">
            <param name="maxLength">0</param>
          </data>
        </element>
      </oneOrMore>
    </element>
  </start>
</grammar>