首页 文章

使用Python解析XML数据

提问于
浏览
2

实际上我正在开发一个小项目,需要解析公共可用的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”条目的列表 . 不幸的是,清单是空的 .

用一些代码玩arround我得到了只解析第一个块的情绪,我能够通过使用代码填充列表中“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

1 回答

  • 3

    您可以直接使用 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的一些参考:

相关问题