使用lxml将XML转换为Python对象

3 投票
1 回答
2656 浏览
提问于 2025-04-16 00:50

我正在尝试使用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)一样简单):

  1. 显示所有书籍及其各自的属性
  2. 通过从列表中选择书籍来查看书籍的更多详细信息

1 个回答

1

首先,"list"这个变量名不太好,因为它会“遮盖”掉内置的类型"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上下文设置为书籍对象,然后在模板中使用它。

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

这样你就可以在模板中遍历书籍,并访问每本书的属性了。

撰写回答