2012-10-25 49 views
1

我想使用Relax NG模式來驗證XML文件。作爲驗證的一部分,我想確保一組節點中沒有空白。例如,我想前兩個<emptyCheck>節點來驗證,但第三和第四那些在這個例子中失敗:使用Relax NG來驗證XML節點是空的並且沒有空白空間

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

下RELAX NG模式幾乎工作。上面的示例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模式,以便文檔不會驗證節點是否應該完全空白時纔有空白區域?

回答

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> 
+0

我使用的驗證器是隨Oxygen XML Editor(v13)一起提供的驗證器。該解決方案按預期工作。謝謝。 –