【问题标题】:Use Relax NG to verify an XML node is empty and devoid of white space使用 Relax NG 验证 XML 节点是否为空且没有空格
【发布时间】:2012-10-15 23:38:06
【问题描述】:

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

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

下面的 Relax NG Schema 几乎可以工作。对于&lt;emptyCheck&gt; 的第四个实例,上述示例 XML 失败,但对于第三个实例则没有。

<?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 模式,这样当一个节点应该完全为空时,文档将不会验证它是否只有空白?

【问题讨论】:

    标签: xml validation whitespace relaxng


    【解决方案1】:

    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>
    

    【讨论】:

    • 我使用的验证器是 Oxygen XML Editor (v13) 附带的。该解决方案可以按预期工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 2013-06-01
    • 2011-09-13
    • 2010-12-05
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多