Поскольку элементы 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']")