Как установить префикс пространства имен в значении атрибута с помощью lxml? - PullRequest
3 голосов
/ 10 сентября 2010

Я пытаюсь создать XML-схему, используя lxml.Для начала что-то вроде этого:

<xs:schema xmlns="http://www.goo.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"         elementFormDefault="qualified" targetNamespace="http://www.goo.com">
  <xs:element type="xs:string" name="name"/>
  <xs:element type="xs:positiveInteger" name="age"/>
</xs:schema>

Я сделал это таким образом - путём установки xs: before value, но я думаю, что это можно сделать лучше.это будет написано как-то лучше?

1 Ответ

2 голосов
/ 10 сентября 2010

В некотором смысле, вам нужно включить "xs": SCHEMA_NAMESPACE или что-то подобное в ваш NSMAP - иначе ничто в вашем сгенерированном XML фактически не отображает префикс 'xs' в правильное пространство имен.Это также позволит вам просто указывать имена элементов с префиксами;например, "xs: element".

Что касается вашего основного вопроса, я думаю, что это, вероятно, хорошо, если вы всегда везде используете одно и то же отображение префикса в пространство имен, например, с глобальным * 1004.*.Если вы обрабатываете XML с потенциально произвольными префиксами пространства имен, убедитесь, что либо:

  • добавьте свой nsmap с префиксом 'xs' к каждому создаваемому элементу;или
  • используйте атрибут _Element.nsmap, чтобы получить карту пространства имен родительского атрибута, инвертировать его и найти соответствующий префикс в инвертированной карте.

Примерпоследний:

SCHEMA_NAMESPACE = "http://www.w3.org/2001/XMLSchema"

def add_element(schema):
    nsmap = schema.nsmap
    nsrmap = dict([(uri, prefix) for prefix, uri in nsmap.items()])
    prefix = nsrmap[SCHEMA_NAMESPACE]
    xs = lambda name: "%s:%s" % (prefix, name)
    element = schema.makeelement(xs("element"), nsmap=nsmap,
                                 attrib={'name': 'age', 'type': xs('string')})
    schema.append(element)
    return etree.tostring(schema, pretty_print=True)

Но это, вероятно, излишне для большинства случаев.

...