2011-06-08 123 views
1

我想根據模式來驗證我的xml,但是對於某些節點,我希望比xsd模式可以提供更智能的驗證。javascript類型的xsd限制

例如,我有一個Person.xml文件:

<?xml version="1.0" encoding="utf-8"?> 
<person xmlns="urn:person.xsd"> 
    <name>John Smith</name> 
    <id>123455</id> 
</person> 

我想驗證在智能方式的ID節點:第一5位(12345)是該人的ID,和第六位數字(5)是一個校驗和位數,它是通過前五位模10(1 + 2 + 3 + 4 + 5模10 = 5)的總和計算出來的。

理想情況下,我想擴展xsd模式的驗證支持,以允許諸如javascript的代碼驗證節點。

例如:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="urn:person.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="person"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="name" type="xs:string" /> 
     <xs:element name="id"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:javascript> 
       var b= parseInt(input); 
       var b1= parseInt(b/100000)%10; 
       var b2= parseInt(b/10000)%10; 
       var b3= parseInt(b/1000)%10; 
       var b4= parseInt(b/100)%10; 
       var b5= parseInt(b/10)%10; 
       var b6= b%10; 

       if (b6 == (b1+b2+b3+b4+b5)%10) 
        return "true"; 
       else 
        return "false"; 
       </xs:javascript> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

現在,這當然是不支持的。我可以將此節點驗證爲字符串,並在我的源代碼中進行進一步驗證。但我想要一個通用的解決方案,並且我的代碼除了任何xml,並且不想要硬編碼的解決方案。

這可能是一個常見問題,但我一直無法找到解決方案。

那麼最好的地方放置額外的驗證信息?

另外還有一種方法來擴展MSXML或.Net的XML驗證器,以支持自定義驗證(我的程序主要是在.Net中編寫的)?

謝謝

回答

0

在標準的XSD,你可以得到最接近的是使用了pattern element。這指定了內容必須符合的正則表達式。

但是,正則表達式只適用於相當簡單的驗證,並且不能滿足您的要求。

一個選項是將腳本添加到該類型的annotation element。這是爲「模式組件的以人員和機器定位的註釋」而設計的。然後,您可以執行此腳本作爲第二階段,從而創建您想要的更一般的解決方案。

由於您使用的是MSXML,因此您可以使用SOM檢索XSD數據類型。