如何在 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 个缺陷:
- 第
for line in root.findall('.Version'):
行有多余的点。
请注意 Version 是根元素的直接后裔,因此它
只放标签名就够了(其实不止,后面会详细介绍)。
- 行
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(),因为您的标签有前导
换行.
我正在尝试读取某个项目的一些 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 个缺陷:
- 第
for line in root.findall('.Version'):
行有多余的点。 请注意 Version 是根元素的直接后裔,因此它 只放标签名就够了(其实不止,后面会详细介绍)。 - 行
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(),因为您的标签有前导 换行.