首页 > 解决方案 > Python lxml:如何拆分逗号分隔的数据并从 XML 文件中查找特定值?

问题描述

我有一个包含数千行数据的 XML 文件。一个 XML 文件如下所示:

<logs xmlns="http://www.xxxxxx.org/xxxxxx/1ser" 
<data> 0.0,1.0,3.0 </data>
<data> 0.5,2.0,4.0 </data>
<data> 1.0,5.0,10.0 </data>
</logs>

我只需要从每个文件中读取一个特定的标签。从示例 XML 中,我只需要第三行和那里的两个值(第一个“列”和第六列)。数据标签内的值以逗号分隔。基本上,我需要根据我已经知道的位置查找和打印温度值。

我从 lxml.etree 和打印整个数据集的代码开始:

import lxml.etree as ET
file='data.xml'
tree = ET.parse(file)
root = tree.getroot()
for data in root.iter(data):
    print(data.text)

编辑1

一旦我得到使用 Xpath 和 split-method 的建议,我就编写了一段代码,如下所示:

import lxml.etree as ET
file='data.xml'
tree = ET.parse(file)
root = tree.getroot()
ns = {'n': 'http://www.xxxxxx.org/xxxxxx/1ser'}
for data in root.xpath('//n:data[contains(text(), "1.0")]', namespaces=ns):
    print(data.text)

这会产生输出为 1.0,5.0,10.0

使用这种方法,我可以根据位置(1.0 m)搜索并获取第三行。但是,目前我无法拆分标签的内部文本,我不知道该怎么做:

如果我尝试像这样拆分上述输出

datat = data.split(",")

我得到属性错误:

AttributeError: 'lxml.etree._Element' object has no attribute 'split'

而且我想这意味着 lxml 没有 split 方法,我需要找出另一种方法来做到这一点。如果我尝试以这种方式拆分上述输出:

datat = [i.split(",") for i in data]
print(datat[0])

我的输出只是空括号,这意味着这个 for 循环很可能什么都不做。打印 datat 给了我这个错误,这很可能证明我没有做对。

IndexError: list index out of range

拆分后我想要的输出是 '1.0','5.0','10.0' 为了得到我想要的输出值10.0。在拆分方法之后,我猜可以找到 vale 添加两行:

T = float(datat[5])
print(T.text)

有谁知道我的拆分方法有什么问题?由于我做得不对,还没有通过谷歌找到任何有用的建议。

标签: pythonlxml

解决方案


感谢您提供有关 Xpath 和 split 方法的建议。最后,我找到了一个解决方案来获得我正在寻找的价值:

import lxml.etree as ET
file='data.xml'
tree = ET.parse(file)
root = tree.getroot()
ns = {'n': 'http://www.xxxxxx.org/xxxxxx/1ser'}
for data in root.xpath('//n:data[contains(text(), "1.0")]', namespaces=ns):
        data_string = data.text
        print(data_string)
        split_data = data_string.split(',')
        print(split_data)
        T = float(split_data[2])
        print(T)

问题似乎是我没有创建一个字符串。基本上,我的编辑部分缺少一行:

data_string = data.text
print(data_string)

带输出: 1.0,5.0,10.0 此命令拆分数据:

split_data = data_string.split(',')
print(split_data)

输出: ['\n1.0', 5.0, 10.0\n']

最后,这给了我正在寻找的输出:

T = float(split_data[2])
print(T)

输出: 10.0


推荐阅读