如何在python中读取此XML文件

2024-09-30 20:28:01 发布

您现在位置: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”这样的特定元素时,它不会返回任何内容。这是电流输出:


<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”

有人能帮忙吗


Tags: orgimporthttpversionwwwrootxmlet
1条回答
网友
1楼 · 发布于 2024-09-30 20:28:01

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

  1. for line in root.findall('.Version'):行中有不必要的点。 请注意,Version是根元素的直接descenant,因此 只需输入标记名就足够了(事实上,不仅如此,后面还有详细信息)
  2. print(line.text)行没有缩进,所以实际上应该有 收到一个编译错误

如何正确使用名称空间的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}')

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

也考虑打印EM>Le.Text .Studio()EME>,因为您的标签具有领先性。 换行符

相关问题 更多 >