使用Python解析XML数据

时间:2018-02-04 01:01:20

标签: python xml parsing lxml

实际上我正在开发一个小项目,需要解析公共可用的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)

我希望得到一份所有&#34; parkingAreaReference&#34; XML文档中的条目。不幸的是,这个清单是空的。

使用一些代码播放arround我得到了只解析第一个块的情绪,我能够使用&#34; parkingAreaOccupancy&#34;的值来填充列表。 &#34; parkingAreaReference&#34; ID =&#34; 2 [采尔]&#34;使用代码阻止

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

 print(*locations)

- &GT; 0.2533602

这不是预期的结果

- &GT; 0.2533602 - &GT; 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

1 个答案:

答案 0 :(得分:3)

您可以直接使用etree并使用XPath 1 查询查找有趣的元素。需要注意的一件重要事情是,您的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的一些参考: