Проверка и заполнение значений по умолчанию в XML на основе XSD в Python - PullRequest
3 голосов
/ 10 июня 2010

Как заполнить значение по умолчанию в моем XML во время проверки по XSD? Если мой атрибут не определен как use="require" и имеет default="1", возможно заполнить эти значения по умолчанию из XSD в XML.

Пример: Оригинальный XML:

<a>
 <b/>
 <b c="2"/>
</a>

XSD схема:

<xs:element name="a">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="b" maxOccurs="unbounded">
    <xs:attribute name="c" default="1"/>
   </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:element>

Я хочу проверить исходный XML с использованием XSD и заполнить все значения по умолчанию:

<a>
 <b c="1"/>
 <b c="2"/>
</a>

Как мне получить это на Python? С проверкой нет проблем (например, XMLSchema). Проблема заключается в значениях по умолчанию.

1 Ответ

3 голосов
/ 16 ноября 2011

Чтобы прокомментировать мой комментарий, вот код

from lxml import etree
from lxml.html import parse

schema_root = etree.XML('''\
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="b" maxOccurs="unbounded">
    <xs:complexType>
     <xs:attribute name="c" default="1" type="xs:string"/>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:element>
</xs:schema>''')

xmls = '''<a>
 <b/>
 <b c="2"/>
</a>'''

schema = etree.XMLSchema(schema_root)
parser = etree.XMLParser(schema = schema, attribute_defaults = True)

root = etree.fromstring(xmls, parser)
result = etree.tostring(root, pretty_print=True, method="xml")

print result

, который даст вам

<a>
 <b c="1"/>
 <b c="2"/>
</a>

Я немного изменил ваш XSD, завернутый xs:attribute в xs:complexTypeи добавил пространство имен схемы.Чтобы ввести значения по умолчанию, вам нужно передать attribute_defaults=True в etree.XMLParser(), и оно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...