XML to Python Object Conversion

111 阅读2分钟

1.有时候我们需要将 XML 数据转换为 Python 对象,以方便数据操作和分析。然而,由于 XML 数据的复杂结构,直接转换可能存在困难。在本技术文章中,我们将介绍如何使用 lxml.objectify 和 Beautiful Soup 库将 XML 数据转换为 Python 对象。

  1. 解决方案

方法一:使用 lxml.objectify

lxml.objectify 是一个 Python 库,可以将 XML 数据解析为 Python 对象。它提供了简单易用的 API,可以轻松地访问 XML 数据的元素和属性。

以下是一个使用 lxml.objectify 库的示例代码:

from lxml import objectify

xml = """<main>
    <object1 attr="name">content</object1>
</main>"""

main = objectify.fromstring(xml)
print(main.object1.text)  # 输出: content
print(main.object1.get('attr'))  # 输出: name

方法二:使用 Beautiful Soup

Beautiful Soup 是一个 Python 库,可以将 HTML 和 XML 数据解析为 Python 对象。它提供了丰富的 API,可以轻松地查找、提取和修改 HTML/XML 数据。

以下是一个使用 Beautiful Soup 库的示例代码:

from BeautifulSoup import BeautifulSoup

xml = """<main>
    <object1 attr="name">content</object1>
</main>"""

soup = BeautifulSoup(xml)
object1 = soup.find('object1')
print(object1.text)  # 输出: content
print(object1['attr'])  # 输出: name

方法三:使用 gnosis.xml.objectify

gnosis.xml.objectify 是一个 Python 库,可以将 XML 数据解析为 Python 对象。它提供了一个简单的 API,可以轻松地访问 XML 数据的元素和属性。

以下是一个使用 gnosis.xml.objectify 库的示例代码:

from gnosis.xml import objectify

xml = """<main>
    <object1 attr="name">content</object1>
</main>"""

root = objectify.make_instance(xml)
print(root.nodes.node[0].PCDATA)  # 输出: node 1
print(root.nodes.node[1].PCDATA)  # 输出: node 2

方法四:使用 simplexmlparse

simplexmlparse 是一个 Python 库,可以将 XML 数据解析为 Python 对象。它提供了一个简单的 API,可以轻松地访问 XML 数据的元素和属性。

以下是一个使用 simplexmlparse 库的示例代码:

import simplexmlparse

xml = """<main>
    <object1 attr="name">content</object1>
</main>"""

data = simplexmlparse.parse(xml)
print(data['main']['object1']['@attr'])  # 输出: name
print(data['main']['object1']['#text'])  # 输出: content

方法五:使用 Coll 类

from BeautifulSoup import BeautifulSoup

# 创建一个 Coll 类来存储 Foo 类的对象
class Coll(object):
    def __init__(self):
        self.foos = {}        

    def add(self, fooobj):
        self.foos[fooobj.name]=fooobj

    def get(self, name):
        return self.foos[name]

# 创建一个 Foo 类来存储 XML 数据中的对象
class Foo(object):
    def __init__(self, name, attr1=None, attr2=None):
        self.name=name
        self.attr1=attr1
        self.attr2=attr2

# 解析 XML 数据
s = """<main>
         <object name="somename">
             <attr name="attr1">value1</attr>
             <attr name="attr2">value2</attr>
         </object>
         <object name="someothername">
             <attr name="attr1">value3</attr>
             <attr name="attr2">value4</attr>
         </object>
     </main>
"""
soup = BeautifulSoup.BeautifulSoup(s)

# 创建一个 Coll 对象来存储 Foo 类的对象
bars = Coll()

# 循环遍历 XML 数据中的对象并将其存储在 Coll 对象中
for each in soup.findAll('object'):
    bar = Foo(each['name'])
    attrs = each.findAll('attr')
    for attr in attrs:
        setattr(bar, attr['name'], attr.renderContents())
    bars.add(bar)

# 从 Coll 对象中获取指定名称的对象并打印其属性
print(bars.get('somename').__dict__)
print('\n\n', bars.get('someothername').__dict__)

输出:

{'attr2': 'value2', 'name': 'somename', 'attr1': 'value1'}


{'attr2': 'value4', 'name': 'someothername', 'attr1': 'value3'}