如何在 python 中阅读此 XML 文件

How to read this XML file in python

我正在尝试读取某个项目的一些 xml 数据,但它就是行不通...我有这段代码(使用过的 xml 文件如下所示):

import time
from xml.etree.ElementTree import fromstring, ElementTree
import xml.etree.ElementTree as ET
ET.register_namespace('', "http://www.w3.org/2001/XMLSchema-instance")
ET.register_namespace('', "http://bison.connekt.nl/tmi8/kv6/msg")

while True:
    print("--------------------------------------------")
    tree = ET.parse("RET.xml")
    root = tree.getroot()
    print(root)
    for debug in root.findall(".//"): 
        print(debug.text)
    for line in root.findall('.Version'):
    print(line.text)
    print("--------------------------------------------")
    time.sleep(5)

它成功地找到了所有元素的内容,但是当我搜索特定元素时'Version' 它不会return 任何内容。这是当前输出:


<Element '{http://bison.connekt.nl/tmi8/kv6/msg}VV_TM_PUSH' at 0x03D775A0>

RET

BISON 8.1.1.0
KV6posinfo
2020-12-04T21:22:56.1275145+01:00
ttt

RET
M007

2020-12-04

200180

0

HA8215

0

2020-12-04T21:22:56.1119143+01:00

SERVER

0
-920

--------------------------------------------

这是使用过的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<VV_TM_PUSH xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://bison.connekt.nl/tmi8/kv6/msg">
<SubscriberID>
RET</SubscriberID><Version>
BISON 8.1.1.0</Version>
<DossierName>KV6posinfo</DossierName>
<Timestamp>2020-12-04T21:22:56.1275145+01:00</Timestamp>
<KV6posinfo>ttt
<ONSTOP>
<dataownercode>RET</dataownercode>
<lineplanningnumber>M007</lineplanningnumber>
<operatingday>2020-12-04</operatingday>
<journeynumber>200180</journeynumber>
<reinforcementnumber>0</reinforcementnumber>
<userstopcode>HA8215</userstopcode>
<passagesequencenumber>0</passagesequencenumber>
<timestamp>2020-12-04T21:22:56.1119143+01:00</timestamp>
<source>SERVER</source>
<vehiclenumber>0</vehiclenumber>
<punctuality>-920</punctuality>
</ONSTOP>
</KV6posinfo>
</VV_TM_PUSH>

为了测试目的,我在标签中添加了 'ttt'。

有人能帮忙吗?

我发现您的代码中有 2 个缺陷:

  1. for line in root.findall('.Version'):行有多余的点。 请注意 Version 是根元素的直接后裔,因此它 只放标签名就够了(其实不止,后面会详细介绍)。
  2. print(line.text) 没有缩进,所以实际上你应该 收到编译错误。

现在如何正确使用 namespaced XML:

请注意,您的输入文件包含默认命名空间 (http://bison.connekt.nl/tmi8/kv6/msg)

那么如果你想引用这个命名空间中的任何元素,你必须:

  • 定义一个名称空间字典(键 - 前缀,值 - URI),在你的 只有一对“前缀:URI”,
  • 在标签名称前加上命名空间前缀和一个冒号,
  • 将命名空间字典作为第二个参数传递给例如findall.

因此,在您的情况下,将相应的代码片段替换为:

ns = {'bis': 'http://bison.connekt.nl/tmi8/kv6/msg'}
for line in root.findall('bis:Version', ns):
    print(f'Version: {line.text}')

我添加了 版本: 以指示已打印的内容。

同时考虑打印 line.text.strip(),因为您的标签有前导 换行.