Есть ли способ использовать lxml.etree, чтобы пропустить первую запись или запустить итерацию для определенного дочернего элемента при анализе файла XML? - PullRequest
1 голос
/ 21 мая 2019

В настоящее время я использую метод .iter в пакете xlml.etree для Python для анализа XML-файла.Есть ли способ пропустить первую запись или запустить итерацию для конкретного потомка, используя что-то вроде XPath?

Я исследовал методы itertext и iterparse, но я не был уверен, основываясь на их определениях, что он сделает гораздо больше, чем поможет сузить iter для конкретных тегов, что я уже сделал.

import lxml.etree as et

parsedXML = et.parse(file_path)

for child in parsedXML.iter('{http://www.witsml.org/schemas/131}data'):

Код успешно проанализировал XML-файл, но я хотел бы сократить время, пропуская последние строки (которые разделены запятыми), которые пусты или не содержат достаточного количества символов.

<logData>
<data>63653079886,,,,,,,,,,,,,,,,,,,,,,,</data>
<data>63653079887,,,,,,,,,,,,,,,,,,,,,,,</data>
<data>63653079888,,,,,,,,,,,,,,,,,,,,,,,</data>
<data>63653079889,,,,,,,,,,,,,,,,,,,,,,,</data>
<data>63653079890,,29.3,155.8,12.25,0.0,0,0,95.31,-86.11,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>
<data>63653079891,,29.3,155.7,12.25,0.0,0,0,95.31,-86.11,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>
<data>63653079892,,29.3,155.8,12.25,0.0,0,0,93.76,-87.65,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>

Есть строки и строки строк, которые являются пустыми, за исключением 11-значного значения в каждой строке.Я хотел бы перепрыгнуть через это и запустить iter в строке, которая в этом случае имеет значение 12,25 (5-я строка в примере).

1 Ответ

0 голосов
/ 23 мая 2019

Поскольку элементы data только с 11-значным значением и запятыми (без пробелов) имеют длину 34 символа, вы можете проверить длину строки в предикате :

data[string-length(translate(.,' ','')) > 34]

Я использовал translate() для удаления любых пробелов перед проверкой длины строки.

Пример ...

Ввод XML (input.xml)

<logData>
    <data>63653079886,,,,,,,,,,,,,,,,,,,,,,,</data>
    <data>63653079887,,,,,,,,,,,,,,,,,,,,,,,</data>
    <data>63653079888,,,,,,,,,,,,,,,,,,,,,,,</data>
    <data>63653079889,,,,,,,,,,,,,,,,,,,,,,,</data>
    <data>63653079889, , , , , , , , , , , , , , , , , , , , , , ,</data>
    <data>63653079890,,29.3,155.8,12.25,0.0,0,0,95.31,-86.11,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>
    <data>63653079891,,29.3,155.7,12.25,0.0,0,0,95.31,-86.11,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>
    <data>63653079892,,29.3,155.8,12.25,0.0,0,0,93.76,-87.65,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>
</logData>

Python (я использовал XMLParser () , чтобы сделать вывод на печать более приятным. Это не обязательно).

from lxml import etree

parser = etree.XMLParser(remove_blank_text=True)

tree = etree.parse("input.xml", parser=parser)

for data in tree.xpath("data[string-length(translate(.,' ','')) > 34]"):
    print(etree.tostring(data).decode())

Вывод (вывод на консоль)

<data>63653079890,,29.3,155.8,12.25,0.0,0,0,95.31,-86.11,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>
<data>63653079891,,29.3,155.7,12.25,0.0,0,0,95.31,-86.11,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>
<data>63653079892,,29.3,155.8,12.25,0.0,0,0,93.76,-87.65,1729654,1202864,1319105,1.00,1.00,-511.4,1.95,74,0,0,264.1,3.4,,356.9</data>

Если вы действительно хотите проверить значение 12.25, в предикате XPath 1.0 это немного запутаннокогда длины строк значений до этого неизвестны.Вы можете сделать это с помощью ряда substring-afters () внутри substring-before () .Это не красиво, хотя ...

xpath("data[substring-before(substring-after(substring-after(substring-after(substring-after(translate(.,' ',''),','),','),','),','),',') = '12.25']")
...