使用 Python 解析 XML 数据

Parsing XML Data with Python

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

XML数据Link: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[ 的 "parkingAreaOccupancy" 的值填充列表Zeil]" 块使用代码

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

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

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

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

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 的参考资料: