Преобразование XML в объекты Python с использованием lxml - PullRequest
3 голосов
/ 05 июля 2010

Я пытаюсь использовать библиотеку lxml для синтаксического анализа XML-файла ... я хочу использовать XML в качестве источника данных, но при этом поддерживать нормальный Django-способ взаимодействия с полученными объектами ... документы, я вижу, что lxml.objectify - это то, что я должен использовать, но я не знаю, как действовать после: list = objectify.parse('myfile.xml')

Любая помощь будет очень ценится. Спасибо.

Пример файла (содержит около 100+ записей):

<store>
   <book>
      <publisher>Hodder &...</publisher>
      <isbn>345123890</isbn>
      <author>King</author>
      <comments>
         <comment rank='1'>Interesting</comment>
      <comments>
      <pages>200</pages>
   </book>
   <book>
      <publisher>Penguin Books</publisher>
      <isbn>9011238XX</isbn>
      <author>Armstrong</author>
      <comments />
      <pages>150</pages>
   </book>
</store>

Исходя из этого, я хочу сделать следующее (написать что-то столь же простое, как Books.objects.all() и Books.object.get_object_or_404(isbn=selected) is most preferred ):

  1. Показать список всех книг с соответствующими атрибутами
  2. Включить просмотр дополнительной информации о книге, выбрав ее из списка

1 Ответ

1 голос
/ 05 июля 2010

Во-первых, «список» не очень хорошая переменная, потому что он «затеняет» встроенный тип «list

Теперь, скажем, у вас есть этот xml:

<root>
<node1 val="foo">derp</node1>
<node2 val="bar" />
</root>

Теперь вы можете сделать это:

root = objectify.parse("myfile.xml")
print root.node1.get("val") # prints "foo"
print root.node1.text # prints "derp"
print root.node2.get("val") # prints "bar"

Еще один совет: если у вас много узлов с одинаковым именем, вы можете зациклить их.

>>> xml = """<root>
    <node val="foo">derp</node>
    <node val="bar" />
    </root>"""
>>> root = objectify.fromstring(xml)
>>> for node in root.node:
    print node.get("val")

foo
bar

Редактировать

Вы должны иметь возможность просто установить контекст django для объекта books и использовать его из своих шаблонов.

context = dict(books = root.book,
               # other stuff
               )

И тогда вы сможете перебирать книги в шаблоне и получать доступ к атрибутам каждого объекта книги.

...