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

2024-05-19 14:13:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用.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(在这个例子中是第五行)。你知道吗


Tags: 文件方法data条目xmlxpath例子et
1条回答
网友
1楼 · 发布于 2024-05-19 14:13:57

由于data元素只有11位的值和逗号(没有任何空格)是34个字符,因此可以测试predicate中的string length

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

在检查字符串长度之前,我使用^{}删除了所有空格。你知道吗

示例。。。你知道吗

XML输入(输入.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值,那么XPath1.0谓词中的值的字符串长度未知时会有点混乱。你可以在一个substring-before()中用一系列的substring-afters()来实现。但它并不漂亮。。。你知道吗

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

相关问题 更多 >