【问题标题】:Parsing XML Data with Python使用 Python 解析 XML 数据
【发布时间】:2018-02-04 01:01:20
【问题描述】:

实际上我正在做一个小项目,需要解析公共可用的 XML 数据。我的目标是将数据写入 mysql 数据库以进行进一步处理。

XML 数据链接:http://offenedaten.frankfurt.de/dataset/912fe0ab-8976-4837-b591-57dbf163d6e5/resource/48378186-5732-41f3-9823-9d1938f2695e/download/parkdatendyn.xml

XML 结构(示例):

<parkingAreaStatus>
      <parkingAreaOccupancy>0.2533602</parkingAreaOccupancy>
      <parkingAreaOccupancyTrend>stable</parkingAreaOccupancyTrend>
      <parkingAreaReference targetClass="ParkingArea" id="2[Zeil]" 
       version="1.0"/>
      <parkingAreaStatusTime>2018-02-
       04T01:30:00.000+01:00</parkingAreaStatusTime  
      </parkingAreaStatus>

<parkingAreaStatus>
      <parkingAreaOccupancy>0.34625</parkingAreaOccupancy>
      <parkingAreaOccupancyTrend>stable</parkingAreaOccupancyTrend>
      <parkingAreaReference targetClass="ParkingArea" id="5[Dom / Römer]" 
       version="1.0"/>
      </parkingAreaStatus>

使用代码

import csv
import pymysql
import urllib.request

url = "http://offenedaten.frankfurt.de/dataset/912fe0ab-8976-4837-b591-57dbf163d6e5/resource/48378186-5732-41f3-9823-9d1938f2695e/download/parkdatendyn.xml"

from lxml.objectify import parse
from lxml import etree
from urllib.request import urlopen
locations_root = parse(urlopen(url)).getroot()


locations = list(locations_root.payloadPublication.genericPublicationExtension.parkingFacilityTableStatusPublication.parkingAreaStatus.parkingAreaReference)

print(*locations)

我希望获得 XML 文档中所有“parkingAreaReference”条目的列表。不幸的是,列表是空的。

用一些代码玩弄我得到了只有第一个块被解析的情绪,我能够通过使用“parkingAreaReference”id="2[Zeil]" 块的“parkingAreaOccupancy”值填充列表代码

locations = list(locations_root.payloadPublication.genericPublicationExtension.parkingFacilityTableStatusPublication.parkingAreaStatus.parkingAreaOccupancy)

 print(*locations)

-> 0.2533602

这不是预期的结果

-> 0.2533602 -> 0.34625

我的问题是:

什么是获得矩阵的最佳方法,我可以进一步使用所有块,包括。 XML 文档中规定的相应值?

示例输出:

A = [[ID:2[Zeil],0.2533602,stable,2018-02-
   04T01:30:00.000+01:00],[id="5[Dom / Römer],0.34625,stable,2018-02-
   04T01:30:00.000+01:00]]

一般来说

A = [parkingAreaOccupancy,parkingAreaOccupancyTrend,parkingAreaStatusTime,....],[parkingAreaOccupancy,parkingAreaOccupancyTrend,parkingAreaStatusTime,.....]

经过数小时的研究,我希望从您的网站获得一些提示

提前谢谢你,

TR

【问题讨论】:

    标签: python xml parsing lxml


    【解决方案1】:

    您可以直接使用etree 并使用XPath1 查询找到有趣的元素。需要注意的一件重要事情是,您的 XML 在根元素处声明了默认命名空间:

    xmlns="http://datex2.eu/schema/2/2_0"
    

    根据定义,声明了默认命名空间的元素和所有没有前缀的后代元素都属于此默认命名空间(除非在其中一个后代元素中找到另一个默认命名空间,而您的 XML 不是这种情况)。这就是为什么我们在下面的代码中定义了一个前缀d,它引用了默认的命名空间URI,我们使用该前缀来查找我们需要从中获取信息的每个元素:

    root = etree.parse(urlopen(url)).getroot()
    ns = { 'd': 'http://datex2.eu/schema/2/2_0' }
    parking_area = root.xpath('//d:parkingAreaStatus', namespaces=ns)
    for pa in parking_area:
        area_ref = pa.find('d:parkingAreaReference', ns)
        occupancy = pa.find('d:parkingAreaOccupancy', ns)
        trend = pa.find('d:parkingAreaOccupancyTrend', ns)
        status_time = pa.find('d:parkingAreaStatusTime', ns)
        print area_ref.get('id'), occupancy.text, trend.text, status_time.text
    

    下面是上面演示代码的输出。除了print,您可以将这些信息存储在您喜欢的任何数据结构中:

    2[Zeil] 0.22177419 stable 2018-02-04T05:16:00.000+01:00
    5[Dom / Römer] 0.28625 stable 2018-02-04T05:16:00.000+01:00
    1[Anlagenring] 0.257889 stable 2018-02-04T05:16:00.000+01:00
    3[Mainzer Landstraße] 0.20594966 stable 2018-02-04T05:16:00.000+01:00
    4[Bahnhofsviertel] 0.31513646 stable 2018-02-04T05:16:00.000+01:00
    

    1) XPath 上的一些参考:

    【讨论】:

    • 感谢 har07 - 提供解决方案和背景信息。像你这样的人让堆栈溢出到原来的样子。周末快乐
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2017-09-11
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多