使用lxml将XML转换为python对象

时间:2010-07-05 10:47:11

标签: python lxml xml-parsing

我正在尝试使用lxml库来解析XML文件...我想要的是使用XML作为数据源,但仍然保持与生成的对象交互的正常Django方式...来自docs,我可以看到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. 通过从列表
  3. 中选择书籍,可以查看书籍的更多详细信息

1 个答案:

答案 0 :(得分: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上下文设置为books对象,并使用模板中的内容。

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

然后,您将能够遍历模板中的书籍,并访问每个书籍对象的属性。