如何解析XML里面的数据?
How to parse data inside XML?
知道如何解析这种记录吗?这条记录上有数据。
<record id="1" model="custom.model>
<field name="name">Create</field>
<field name="email_from">dummy@mail.com</field>
<field name="email_to">todummy@mail.com</field>
<field name="email_subject">Create new company</field>
<field name="email_body">
<![CDATA[
<record>
<field name="process">Create</field>
<field name="model">res.company</field>
<field name="name">XYZ Company</field>
<field name="currency_id">base.USD</field>
</record>
]]>
</field>
<field name="email_read">False</field>
</record>
解析 XML 文档:
- 导入
xml.dom.minidom
.
- 使用函数
parse
解析文档:doc=xml.dom.minidom.parse(file name)
.
- 使用以下代码从 XML 文档调用 XML 标签列表:
doc.getElementsByTagName(“name of xml tags”)
.
假设您要查找 CDATA
中的数据,下面的代码会找到此部分并将其解析为 xml。
import xml.etree.ElementTree as ET
xml = '''<record id="1" model="custom.model">
<field name="name">Create</field>
<field name="email_from">dummy@mail.com</field>
<field name="email_to">todummy@mail.com</field>
<field name="email_subject">Create new company</field>
<field name="email_body">
<![CDATA[
<record>
<field name="process">Create</field>
<field name="model">res.company</field>
<field name="name">XYZ Company</field>
<field name="currency_id">base.USD</field>
</record>
]]>
</field>
<field name="email_read">False</field>
</record>'''
outer_root = ET.fromstring(xml)
email = outer_root.find('.//field[@name="email_body"]')
inner_root = ET.fromstring(email.text)
for field in inner_root.findall('field'):
print(f'{field.attrib["name"]} -> {field.text}')
输出
process -> Create
model -> res.company
name -> XYZ Company
currency_id -> base.USD
基本上,您以正常方式使用 XML 解析器解析外部文档,使用 name="email_body"
导航到字段,提取该元素的字符串值,然后将该字符串传递给一个新的 XML 解析器将被再次解析,以获取内部文档。
知道如何解析这种记录吗?这条记录上有数据。
<record id="1" model="custom.model>
<field name="name">Create</field>
<field name="email_from">dummy@mail.com</field>
<field name="email_to">todummy@mail.com</field>
<field name="email_subject">Create new company</field>
<field name="email_body">
<![CDATA[
<record>
<field name="process">Create</field>
<field name="model">res.company</field>
<field name="name">XYZ Company</field>
<field name="currency_id">base.USD</field>
</record>
]]>
</field>
<field name="email_read">False</field>
</record>
解析 XML 文档:
- 导入
xml.dom.minidom
. - 使用函数
parse
解析文档:doc=xml.dom.minidom.parse(file name)
. - 使用以下代码从 XML 文档调用 XML 标签列表:
doc.getElementsByTagName(“name of xml tags”)
.
假设您要查找 CDATA
中的数据,下面的代码会找到此部分并将其解析为 xml。
import xml.etree.ElementTree as ET
xml = '''<record id="1" model="custom.model">
<field name="name">Create</field>
<field name="email_from">dummy@mail.com</field>
<field name="email_to">todummy@mail.com</field>
<field name="email_subject">Create new company</field>
<field name="email_body">
<![CDATA[
<record>
<field name="process">Create</field>
<field name="model">res.company</field>
<field name="name">XYZ Company</field>
<field name="currency_id">base.USD</field>
</record>
]]>
</field>
<field name="email_read">False</field>
</record>'''
outer_root = ET.fromstring(xml)
email = outer_root.find('.//field[@name="email_body"]')
inner_root = ET.fromstring(email.text)
for field in inner_root.findall('field'):
print(f'{field.attrib["name"]} -> {field.text}')
输出
process -> Create
model -> res.company
name -> XYZ Company
currency_id -> base.USD
基本上,您以正常方式使用 XML 解析器解析外部文档,使用 name="email_body"
导航到字段,提取该元素的字符串值,然后将该字符串传递给一个新的 XML 解析器将被再次解析,以获取内部文档。