2010-08-01 2 views
2

Я использую lxml python для проверки xmls на схему. У меня есть схема с элементом:xml validation: проверка типа URI

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

и я испытываю, например, это (часть) XML:

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

Я хотел бы это испытание к провалу, потому что link-url не начинаются с http://. Я попытался переключить anyURI на anyURL, но это приводит к исключению - это недействительный тег.

Возможно ли это с помощью lxml? возможно ли вообще с проверкой схемы?

+0

- это 'anyURL' или' anyURI' в вашей схеме? – kennytm

ответ

2

(я уверен, что xs:anyURL не действует. XML Schema standard называет anyURI. А поскольку link-url является атрибутом, не должны ли вы использовать xs:attribute вместо xs:element?)

Вы можете ограничить URIs от создав новый simpleTypebase d на нем, и положил restriction на pattern. Например,

#!/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" />')))