2010-08-01 125 views
2

我正在使用python的lxml來針對模式驗證xml。我有一個元件的模式:xml驗證:驗證URI類型

<xs:element name="link-url" type="xs:anyURL"/> 

和I測試,例如,本(的一部分)的xml:

<a link-url="server/path"/> 

我想測試失敗,因爲link-url不從http://開始。我嘗試將anyURI切換爲anyURL,但這會導致例外 - 它不是有效的標籤。

這可能與lxml?模式驗證有可能嗎?

+0

是你的模式中的'anyURL'或'anyURI'嗎? – kennytm 2010-08-01 09:48:19

回答

2

(我敢肯定xs:anyURL是無效的。該XML Schema standard稱之爲anyURI。而且,由於link-url是一個屬性,你不應該使用xs:attribute代替xs:element?)

你可以限制通過的URI在其上創建一個新的simpleTypebased,並在pattern上放置一個restriction。例如,

#!/usr/bin/env python2.6 

from lxml import etree 
from StringIO import StringIO 

schema_doc = etree.parse(StringIO(''' 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:simpleType name="httpURL"> 
     <xs:restriction base="xs:anyURI"> 
      <xs:pattern value='https?://.+'/> 
      <!-- accepts only http:// or https:// URIs. --> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="a"> 
     <xs:complexType> 
      <xs:attribute name="link-url" type="httpURL"/> 
     </xs:complexType> 
    </xs:element> 
    </xs:schema> 
''')) #/ 
schema = etree.XMLSchema(schema_doc) 

schema.assertValid(etree.parse(StringIO('<a link-url="http://sd" />'))) 
assert not schema(etree.parse(StringIO('<a link-url="server/path" />')))