【问题标题】:How to convert an xml to json without root in Python?如何在 Python 中将 xml 转换为没有 root 的 json?
【发布时间】:2018-06-01 08:43:23
【问题描述】:

我需要在 python 中将 XML 转换为没有 root 的 json。这是一个 XML 的例子

  <?xml version="1.0" encoding="UTF-8"?>
<root>
  <row>
    <Member_ID>926494</Member_ID>
    <First_Name>Corissa</First_Name>
    <Last_Name>Aguiler</Last_Name>
    <Gender>F</Gender>
    <Age>39</Age>
    <Height>5,3</Height>
    <Weight>130</Weight>
    <Hours_Sleep>8</Hours_Sleep>
    <Calories_Consumed>2501</Calories_Consumed>
    <Exercise_Calories_Burned>990</Exercise_Calories_Burned>
    <Date>9/11/2017</Date>
  </row>
</root>

我需要转换成以下格式的JSON

   {
    "Member_ID": 926494,
    "First_Name": "Corissa",
    "Last_Name": "Aguiler",
    "Gender": "F",
    "Age": 39,
    "Height": "5,3",
    "Weight": 130,
    "Hours_Sleep": 8,
    "Calories_Consumed": 2501,
    "Exercise_Calories_Burned": 990,
    "Date": "9/11/2017"
  },

我正在尝试使用 xmljson 库中的 parker 约定,但我发现的所有示例都使用字符串作为输入。我似乎无法弄清楚如何传递实际的 .xml 文件而不是字符串

例如:

from xmljson import parker, Parker
from xml.etree.ElementTree import fromstring
from json import dumps
dumps(parker.data(fromstring('<x><a>1</a><b>2</b></x>')))
'{"a": 1, "b": 2}'

【问题讨论】:

    标签: python json xml python-3.x


    【解决方案1】:

    您可以使用标准xml 库将其解析为 dict,然后根据需要将 dict 转储为 json:

    xml_raw = """<?xml version="1.0" encoding="UTF-8"?>
    <root>
      <row>
        <Member_ID>926494</Member_ID>
        <First_Name>Corissa</First_Name>
        <Last_Name>Aguiler</Last_Name>
        <Gender>F</Gender>
        <Age>39</Age>
        <Height>5,3</Height>
        <Weight>130</Weight>
        <Hours_Sleep>8</Hours_Sleep>
        <Calories_Consumed>2501</Calories_Consumed>
        <Exercise_Calories_Burned>990</Exercise_Calories_Burned>
        <Date>9/11/2017</Date>
      </row>
      <row>
        <Member_ID>926494</Member_ID>
        <First_Name>Corissa</First_Name>
        <Last_Name>Aguiler</Last_Name>
        <Gender>F</Gender>
        <Age>39</Age>
        <Height>5,3</Height>
        <Weight>130</Weight>
        <Hours_Sleep>8</Hours_Sleep>
        <Calories_Consumed>2501</Calories_Consumed>
        <Exercise_Calories_Burned>990</Exercise_Calories_Burned>
        <Date>9/11/2017</Date>
      </row>
    </root>"""
    
    import xml.etree.ElementTree as ET
    
    root = ET.fromstring(xml_raw)
    
    xml_dict_list = list()
    for row in root.findall('.//row'):
        xml_dict = dict()
        for item in row.findall('./*'):
            xml_dict[item.tag] = item.text
        xml_dict_list.append(xml_dict)
    
    print('dict ->', xml_dict_list)
    import json
    
    json_str = json.dumps(xml_dict_list)
    print('str ->', json_str)
    

    输出:

    dict -> [{'Member_ID': '926494', 'First_Name': 'Corissa', 'Last_Name': 'Aguiler', 'Gender': 'F', 'Age': '39', 'Height': '5,3', 'Weight': '130', 'Hours_Sleep': '8', 'Calories_Consumed': '2501', 'Exercise_Calories_Burned': '990', 'Date': '9/11/2017'}, {'Member_ID': '926494', 'First_Name': 'Corissa', 'Last_Name': 'Aguiler', 'Gender': 'F', 'Age': '39', 'Height': '5,3', 'Weight': '130', 'Hours_Sleep': '8', 'Calories_Consumed': '2501', 'Exercise_Calories_Burned': '990', 'Date': '9/11/2017'}]
    str -> [{"Member_ID": "926494", "First_Name": "Corissa", "Last_Name": "Aguiler", "Gender": "F", "Age": "39", "Height": "5,3", "Weight": "130", "Hours_Sleep": "8", "Calories_Consumed": "2501", "Exercise_Calories_Burned": "990", "Date": "9/11/2017"}, {"Member_ID": "926494", "First_Name": "Corissa", "Last_Name": "Aguiler", "Gender": "F", "Age": "39", "Height": "5,3", "Weight": "130", "Hours_Sleep": "8", "Calories_Consumed": "2501", "Exercise_Calories_Burned": "990", "Date": "9/11/2017"}]
    

    【讨论】:

    • 谢谢,这行得通。还有一个问题,我如何迭代不止一行。当我运行这段代码时,它只提供了 xml 第一行的值。
    • @SamirKhan for row in root.findall('.//row'): ... for item in row.findall('./*'): ...
    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2010-10-03
    • 2019-03-27
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多