Python lxml: как разделить запятые данными и найти конкретные значения из XML-файла? - PullRequest
1 голос
/ 04 июля 2019

У меня есть 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)

EDIT1

Получив совет по использованию 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):
    print(data.text)

Это производит вывод как 1.0,5.0,10.0

Используя этот метод, я могу найти и получить строку номер три в зависимости от местоположения (1,0 м). Однако на данный момент я не могу разбить внутренний текст тега и не знаю, как это сделать:

Если я попытаюсь разделить вышеупомянутый вывод, как это

datat = data.split(",")

Я получаю ошибку атрибута:

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

И я думаю, это означает, что в lxml нет метода расщепления, и мне нужно найти другой способ сделать это. Если я попытаюсь разделить вышеупомянутый вывод таким образом:

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

Мой вывод - только пустые скобки, означающие, что цикл for, скорее всего, ничего не делает. Печать данных дает мне эту ошибку, которая, скорее всего, доказывает, что я не сделал это правильно.

IndexError: list index out of range

Мой желаемый результат после разделения будет '1.0','5.0','10.0' чтобы получить желаемое значение на выходе 10.0. Я полагаю, что после split-метода можно найти vale, добавив еще две строки:

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

Кто-нибудь знает, что не так с моими методами расщепления? Так как я делаю это неправильно и пока не нашел полезного совета через Google.

1 Ответ

1 голос
/ 10 июля 2019

Спасибо за совет, связанный с 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):
        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

...