用Python解析XML数据

用Python解析XML数据,python,xml,parsing,lxml,Python,Xml,Parsing,Lxml,实际上,我正在从事一个小项目,需要解析公共可用的XML数据。我的目标是将数据写入mysql数据库进行进一步处理 XML数据链接: XML结构(示例): 我希望得到XML文档中所有“parkingareference”条目的列表。不幸的是,列表是空的 在玩一些代码时,我感觉只有第一个块被解析,我能够使用代码用“parkingAreaReference”id=“2[Zeil]”块的“ParkingAreaOccupation”值填充列表 locations = list(locations_root

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

XML数据链接:

XML结构(示例):

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

在玩一些代码时,我感觉只有第一个块被解析,我能够使用代码用“parkingAreaReference”id=“2[Zeil]”块的“ParkingAreaOccupation”值填充列表

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不同)。这就是为什么我们在下面的代码中定义一个前缀
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
下面是上面演示代码的输出。您可以将这些信息存储在您喜欢的任何数据结构中,而不是打印:

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的一些参考:

  • :XPath 1.0上最可靠的参考
  • :更温和地介绍基本XPath表达式

感谢您提供的解决方案和背景信息。像你这样的人会让堆栈溢出。周末快乐
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
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