Python lxml E-Factory - PullRequest
       10

Python lxml E-Factory

4 голосов
/ 09 ноября 2011

Я использовал lxml "E-Factory" (он же ElementMaker) для создания XML-документов.Я пытаюсь сгенерировать XML-документ, подобный следующему:

<url>
  <date-added>2011-11-11</date-added>
</url>

Однако, используя E-factory, я не уверен, как указать тире в элементе «data-добавлен».Похоже, интерпретировать черту как знак минус.

Вот документы, на которые я ссылался: http://lxml.de/tutorial.html#the-e-factory

Вот как воспроизвести ошибку:

from lxml import etree
from lxml.builder import ElementMaker 

E = ElementMaker()
URL = E.url
DATE_ADDED = E.date-added

xml = URL(DATE_ADDED(myobject.created.strftime('%Y-%m-%dT%H:%M:%S')),)


NameError global name 'added' is not defined

Кто-нибудь знает хитростьон правильно отображает элемент с тире?

Спасибо, что прочитали это.

Джо

Ответы [ 2 ]

8 голосов
/ 09 ноября 2011

Объяснение: То, что вы ставите после E., должно быть действительным идентификатором Python .Это включает в себя подчеркивание, но не дефисы.E.date-added компилируется «успешно», как если бы это было (E.date) - added, но затем завершается с ошибкой во время выполнения, поскольку (в вашем случае) added не было определено.

Альтернативы:

(1* E.tag - это просто косметический прием, который не работает со всеми допустимыми тегами XML.В действительности атрибуты объекта Python могут быть почти любым старым мусором, вы просто не можете сделать obj.really+funky%attribute*name,dude в исходном коде.Один хитрый трюк заслуживает лучшего трюка: вы можете сохранить тот же шаблон создания элемента, т.е. не нужно указывать тег каждый раз, когда вы создаете элемент, выполнив:

DATE_ADDED = getattr(E, 'date-added')

, а затем с помощью DATE_ADDEDкак вы делаете сейчас.

(2) Если схема находится под вашим контролем, используйте подчеркивание (date_added) вместо дефиса (дата добавлена).

7 голосов
/ 09 ноября 2011

ElementMaker отображает функцию на имя тега (например, с помощью E.date_added) для построения дерева XML.Однако существует несоответствие между разрешенными символами в тегах HTML / XML и функциями Python.Как указано в PEP 8 : "Имена пакетов и модулей Модули должны иметь короткие, строчные имена. В имени модуля можно использовать подчеркивания, если это улучшает читаемость" .Итак, функция date_added включает в себя подчеркивание, которое не может присутствовать в функции Python:

>>> def foo-bar():
  File "<stdin>", line 1
    def foo-bar():
           ^
SyntaxError: invalid syntax

Чтобы решить эту проблему, просто создайте тег date-added чуть более подробно, предоставивимя в качестве аргумента вместо:

>>> etree.tostring(E.url(E('date-added', '2011-11-11')))
'<url><date-added>2011-11-11</date-added></url>'
...