XML 解析(NeTEX 格式)

Posted

技术标签:

【中文标题】XML 解析(NeTEX 格式)【英文标题】:XML parsing (NeTEX format) 【发布时间】:2021-12-25 17:02:13 【问题描述】:

我有一个来自该位置的 xml 文件的巴士票价信息

Bus data from DfT website

我正在努力寻找一种方法来获得

    巴士站名称 Atco 代码 所属的公交站区 该区域的票价

可在标签“ScheduledStopPointRef”中访问。

这里有一个示例 xml

https://data.bus-data.dft.gov.uk/fares/dataset/997/download/

有没有办法使用图书馆 Elementree 或任何其他方法来做到这一点。必须使用多个嵌套的“for”循环遍历 xml 文件。

“某种”工作的测试代码如下所示

tree = ET.ElementTree(file=/path/to/file.xml)
root = tree.getroot()
children = root.getchildren()
for child in children:
    for a in child:
        for b in a:
            for c in b:
                for d in c:
                    if 'FareFrame' in c.tag:
                        for e in d:
                            print("E->", e.text)
                            for f in e:
                                if ('Name' in f.tag):
                                    print("F->", f.text)
                    
                                elif ('members' in f.tag):
                                    for g in f:
                                        print("G tag ->" , g.tag)
                                        print("G->", g.text)

预期输出

请指教。

【问题讨论】:

共享 xml(或它的 有效 子集)。基于xml共享预期输出 @balderman - 你能建议怎么做而不是把问题记下来吗?该链接将您带到可以下载 xml 以查看的页面。 Jack Fleeting 已经暗示了所需的输出。 目前情况如何?您仍然需要有关 XML 的帮助吗?如果你这样做了 - 上传一个文档并解释你需要什么。 @balderman - 正如我在下面对 Jack 解决方案的评论中提到的,他的代码从网页本身获取 JSON,并且链接和 xml 之间没有关联,因此我回到了第 1 方,尝试找到可以帮助解析 xml 的人。顺便说一句 - 我有一个 xml 的 sn-p 供您参考。 很高兴您发布了 xml sn-p。我们越来越近了...现在删除它并上传一个有效的 xml 文档。 【参考方案1】:

您要查找的日期(如果我理解正确的话)是以 json 格式而不是 xml 动态加载的。获得它的方法之一是:

import requests
import json

req = requests.get('https://data.bus-data.dft.gov.uk/api/app/fare_stops/?revision=2457')
data = json.loads(req.text)

#once you have the data, extract the target information:
features = data['features']
for feature in features:
    print(feature['properties']['common_name'],feature['properties']['atco_code'])

输出:

Southfield 040000002345
Dad*** 040000002429
Pearson Close 040000004402
The Bugle Horn PH 040000004404
The Rose & Crown PH 040000004406

等等

【讨论】:

我以为这是 XML 问题.. 文档也有 json 版本吗? @balderman 这确实是一个 XML 问题;也许我错过了什么,但我只能找到 JSON 格式的数据。 啊,这很有趣 - 通过单击我上面粘贴的链接,我被带到 DfT 的特定公交路线的网页,页面上的任何地方都没有提到 aJSON,但是检查源该页面提供了您提到的链接 - data.bus-data.dft.gov.uk/api/app/fare_stops/?revision=2457。有没有办法将我拥有的链接翻译成你找到的那个?我问是因为我正在寻找很多路线,因此需要一种自动化的方式。 @Ananth 不太确定;必须有一些将两者关联起来的查找表。还有一次批量下载所有数据的可能性:data.bus-data.dft.gov.uk/downloads 感谢@JackFleeting,我下载了所有票价数据及其包含 .xml 文件的压缩文件,其中包含所有路线的票价信息 :(。将联系 DfT 的帮助团队,看看他们是否可以指导在查找中。如果不是,我现在必须坚持使用多个“for”循环,除非其他人提供解决方案。【参考方案2】:

试试下面的(bus.xml是链接里的文件)

import xml.etree.ElementTree as ET

root = ET.parse('bus.xml')

points = root.findall('.//http://www.netex.org.uk/netexScheduledStopPoint')
for idx,point in enumerate(points,1):
  print(point.attrib['id'])
  print(point.find('http://www.netex.org.uk/netexName').text)
  print(point.find('http://www.netex.org.uk/netexTopographicPlaceView').find('http://www.netex.org.uk/netexName').text)
  print(f'--------idx----------')
print('Done.')

输出

--------1----------
atco:040000004658
Bus Station
Aylesbury
--------2----------
atco:040000004402
Pearson Close
Aylesbury
--------3----------
atco:040000004918
Churchill Avenue
Aylesbury
--------4----------
atco:040000004917
Aylesbury College
Aylesbury
--------5----------
atco:040000004412
Upton Turn
Stone
--------6----------
atco:040000004410
Long Furlong
Stone
--------7----------
atco:040000004408
Village Hall
Stone
--------8----------
atco:040000004406
The Rose & Crown PH
Stone
--------9----------
atco:040000004404
The Bugle Horn PH
Stone
--------10----------
atco:040000004416
New Road
Dinton
...

【讨论】:

谢谢@balderman。我得到了原理,不得不稍微调整一下以提取我需要的东西。 很高兴我能帮上忙。请接受答案。 我很好奇你为什么标记我? 你为什么认为我标记了你?不是我。

以上是关于XML 解析(NeTEX 格式)的主要内容,如果未能解决你的问题,请参考以下文章

Android之解析XML格式数据

数据解析之XML和JSON

解析格式错误的 XML

java解析Xml格式的字符串

php 如何解析xml格式字符串

定制 Jackson 解析器来完成对复杂格式 XML 的解析