7

我在 python 中使用 dicttoxml 将 dict 转换为 XML 。

我需要将 dict 转换为 XML 属性。

例如:

听写

[
      {
           "@name":"Ravi",
           "@age":21,
           "college":"Anna University"
       }
]

输出 XML

<Student name="Ravi" age=21>
  <college>Anna University</college>
</Student>

代码

dicttoxml(dict, custom_root='Student', attr_type=False, root=True)

实际输出

<Student>
  <key name="name">Ravi</key>
  <key name="age">21</key>
  <college>Anna University</college>
</Student>
4

5 回答 5

5

我可能会建议declxml(完全披露:我写的)。使用 declxml,您可以创建一个称为处理器的对象,它以声明方式定义 XML 的结构。您可以使用处理器来解析和序列化 XML 数据。declxml 与字典、对象和命名元组之间的序列化工作。它处理元素的属性和数组并执行基本验证。

import declxml as xml


student = {
    'name':'Ravi',
    'age':21,
    'college':'Anna University'
}

student_processor = xml.dictionary('Student', [
    xml.string('.', attribute='name'),
    xml.integer('.', attribute='age'),
    xml.string('college')
])

xml.serialize_to_string(student_processor, student, indent='    ')

产生所需的输出

<?xml version="1.0" ?>
<Student age="21" name="Ravi">
    <college>Anna University</college>
</Student>
于 2017-11-13T03:32:53.660 回答
4

dicttoxml 尚不支持此功能,尽管该问题已经存在很长时间了。 https://github.com/quandyfactory/dicttoxml/issues/27

虽然如果您的需求不是那么复杂,您可以尝试这个简单的序列化程序。

https://gist.github.com/reimund/5435343/

在这里找到它:-将 Python 字典序列化为 XML

于 2017-04-03T12:32:38.470 回答
4

我有类似的要求将 XML 转换为 dict,反之亦然。我使用了一个名为xmltodict的库。这个库允许您从 dict 反转到带有属性的 xml。

听写

xmldata = { 'student': {
       "@name":"Ravi",
       "@age":21,
       "college":"Anna University"
}}

代码

import xmltodict

print(xmltodict.unparse(xmldata, pretty=True))
于 2019-06-25T02:05:05.983 回答
2

我也在使用 xmltodict,我认为 Hisham 的回答中有语法错误,但我无法发表评论,所以这里是:

import xmltodict

xmldata = {
       'Student': {
           '@name':'Ravi',
           '@age':21,
           "college":"Anna University"
           }
   }

print(xmltodict.unparse(xmldata,pretty=True))

输出

<?xml version="1.0" encoding="utf-8"?>
<Student name="Ravi" age="21">
        <college>Anna University</college>
</Student>
于 2020-05-20T09:15:56.713 回答
0

这是一些相对简单的代码,它们根据对象类型做出决策。如果一个对象是一个字典,它的键的值在历史上被认为是像 C 或 Java 这样的语言中的“原语”被写为属性,否则创建一个子元素。如果对象是列表,li则为每个列表项创建一个元素。作为基元的项目被写出为元素文本,但作为字典的项目被写出为属性。

#! python3-64

from lxml import etree

import json
import typing

def json_obj_to_xml(parent_element: typing.Optional[etree.Element], new_element_name: str, obj: typing.Union[bool, float, int, str, dict, list]):
    """
    Recursively walk an object and return its XML representation.

    Args:
        parent_element (typing.Optional[etree.Element]): The element that will be the parent of the element that this
            function will create and return.

        new_element_name (str): The name of the element that will be created.

        obj (typing.Union[bool, float, int, str, dict, list]): The object to return XML for.  It is expected that all
            objects passed to this function can be represented in JSON.

    Returns:
        result (etree.Element): An XML element.

    """

    if parent_element is not None:
        new_element = etree.SubElement(parent_element, new_element_name)

    else:
        new_element = etree.Element(new_element_name)

    if type(obj) == dict:
        for key, value in obj.items():
            if type(value) in (dict, list):
                json_obj_to_xml(new_element, key, value)

            else:
                # Convert values to a string, make sure boolean values are lowercase
                new_element.attrib[key] = str(value).lower() if type(value) == bool else str(value)

    elif type(obj) == list:
        for list_item in obj:
            # List items have to have a name.  Here we borrow "li" from HTML which stands for list item.
            json_obj_to_xml(new_element, 'li', list_item)

    else:
        # Convert everything to a string, make sure boolean values are lowercase
        new_element.text = str(obj).lower() if type(obj) == bool else str(obj)

    return new_element

# Read JSON file into a dictionary
json_file = r'C:\Users\ubiquibacon\Desktop\some_json_file.json'
json_file_hndl = open(json_file)
json_dict = json.load(json_file_hndl)
json_file_hndl.close()

# Recursively walk the dictionary to create the XML
root_xml_element = json_obj_to_xml(None, 'root', json_dict)

# Write the XML file
xml_file = f'{json_file}.xml'
with open(xml_file, 'wb') as xml_file_hndl:
    xml_file_hndl.write(etree.tostring(root_xml_element, pretty_print=True, xml_declaration=True))
于 2021-02-06T00:00:14.267 回答