为了账号安全,请及时绑定邮箱和手机立即绑定

将XML转换为Dict / JSON

将XML转换为Dict / JSON

慕斯王 2021-04-09 14:15:52
我需要将XML文件转换为JSON。XML脚本示例如下所示:<?xml version="1.0" encoding="UTF-8"?><osm version="0.6" generator="Overpass API 0.7.55.3 9da5e7ae"><note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note><meta osm_base="2018-06-17T15:31:02Z"/>  <node id="330268305" lat="52.5475000" lon="13.3850775">    <tag k="direction" v="240-60"/>    <tag k="tourism" v="viewpoint"/>    <tag k="wheelchair" v="no"/>  </node>  <node id="330269757" lat="52.5473115" lon="13.3843131">    <tag k="direction" v="240-60"/>    <tag k="tourism" v="viewpoint"/>    <tag k="wheelchair" v="limited"/>  </node>  <way id="281307598">    <center lat="52.4934004" lon="13.4843019"/>    <nd ref="2852755795"/>    <nd ref="3772363803"/>    <nd ref="3772363802"/>    <nd ref="2852755796"/>    <nd ref="2852755797"/>    <nd ref="2852755798"/>    <nd ref="2852755795"/>    <tag k="man_made" v="tower"/>    <tag k="tourism" v="viewpoint"/>    <tag k="tower:type" v="observation"/>    <tag k="wheelchair" v="yes"/>  </way></osm>到目前为止执行的代码。import xml.etree.ElementTree as ETimport jsoninput_file = r"D:\berlin\trial_xml\berlin_viewpoint_locations.xml"tree = ET.parse(input_file)root = tree.getroot()result_list = [{k: (item.get(k) if k != 'extra' else                    {i.get('k'): i.get('v') for i in item.iter('tag')})                for k in ('id', 'lat', 'lon', 'extra')}               for item in tree.findall("./node") + tree.findall('./way')]print(result_list)在一些Stackoverflow专家的协助下,我已经取得了半完成的结果。但是,我仍然需要了解如何:追加坐标,该坐标隐藏在此处提到<center lat="52.4934004" lon="13.4843019"/>的相同result_list fornodes.It works for“ id”中。附加所有引用<nd ref="2852755795"/> <nd ref="3772363803"/>,方法与之相同extra,例如,嵌套列表。
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

当前代码对您不起作用的原因是数据结构不同。我建议为每个node和way类型使用独立的解析器。您已经在解析node类型,因此要解析,way可以构造一个非常简单的循环,如下所示:


way_list = []

for item in tree.findall("./way"):

    # get the center node

    center = item.find('center')


    # get the refs for the nd nodes

    nds = [nd.get('ref') for nd in item.iter('nd')]


    # construct a dict and append to result list

    way_list.append(dict(

        id=item.get('id'),

        lat=center.get('lat'),

        lon=center.get('lon'),

        nds=nds,

        extra={i.get('k'): i.get('v') for i in item.iter('tag')},

    ))

print(way_list)

结果:

[{

    'id': '281307598', 

    'lat': '52.4934004', 

    'lon': '13.4843019', 

    'nds': ['2852755795', '3772363803', '3772363802', '2852755796',

            '2852755797', '2852755798', '2852755795'],

    'extra': {    

        'man_made': 'tower', 

        'tourism': 'viewpoint', 

        'tower:type': 'observation', 

        'wheelchair': 'yes'    

    }

}]


查看完整回答
反对 回复 2021-04-27
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信