Проверка XML: проверка типа URI - PullRequest
2 голосов
/ 01 августа 2010

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

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

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

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

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

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

1 Ответ

2 голосов
/ 01 августа 2010

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

Вы можете ограничить URI, создав для него новый simpleType base 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" />')))
...