python - 在解析 XML 文件时,有没有办法使用 lxml.etree 跳过第一个条目或在特定子项处开始迭代?

标签 python xml parsing xpath lxml

我目前正在使用Python的xlml.etree包中的.iter方法来解析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 位数字之外,有些行和行都是空的。我想跳过它,并在本例中第一个具有 12.25 值的行(示例中的第 5 行)处启动迭代器。

最佳答案

由于仅包含 11 位值和逗号(没有任何空格)的 data 元素为 34 个字符,因此您可以测试 string lengthpredicate :

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']")

关于python - 在解析 XML 文件时,有没有办法使用 lxml.etree 跳过第一个条目或在特定子项处开始迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245160/

相关文章:

Python Numpy Array 邻居的geht值

java - 如何使用映射到 "%20"而不是 '+' 的空格对 XML 字符串进行编码?

html - XPath 根据兄弟/表亲文本选择元素?

python - 我如何编写/维护一个 .txt 文件,其名称和时间(分数列表)按时间增加排序?

python - 绘制与某个值相关的多个数据

python - 将多个列合并为单个列,并以列名作为值

sql - 当存储为 BINARY XML 时,Oracle XMLType 有多大

c++ - 用名称标记 std::function?

c# - 使用 C# 解析 EDI 平面文件?

c++ - 了解 PNG 文件格式 IDAT 段