我正在尝试解析xml文件,我只需要一个属性。有没有简单的方法来获得所述属性?
该文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chunkList SYSTEM "ccl.dtd">
<chunkList>
<chunk id="ch1" type="p">
<sentence id="s1">
<tok>
<orth>testowy</orth>
<lex disamb="1"><base>testowy</base><ctag>adj:sg:nom:m3:pos</ctag></lex>
<prop key="sense:ukb:syns_id">1358</prop>
<prop key="sense:ukb:syns_rank">1358/1.0000000000</prop>
<prop key="sense:ukb:unitsstr">próbny.1(42:jak) testowy.1(42:jak)</prop>
</tok>
<tok>
<orth>plik</orth>
<lex disamb="1"><base>plik</base><ctag>subst:sg:nom:m3</ctag></lex>
<prop key="sense:ukb:syns_id">35864</prop>
<prop key="sense:ukb:syns_rank">35864/0.6075684112 2248/0.3924315888</prop>
<prop key="sense:ukb:unitsstr">plik.2(7:por)</prop>
</tok>
</sentence>
</chunk>
</chunkList>
它将具有可变数量的<tok>
分支,并且每个<tok>
分支可能具有不同数量的密钥。
我需要提取的唯一属性是syns_id。
它可能是一个巨大的xml文件,我想的几百兆字节。
或大约10万个小的,只有大约5-10 <tok>
。
我需要的是一个包含所有这些syns_id的列表。 我该怎么办呢?我认为正则表达式会解决它,但我还没有使用它们。或者有更快/更好的方式吗?
答案 0 :(得分:1)
我不确切知道这是多么可扩展,但这在任何情况下都是我的第一次尝试:
import lxml.etree
et = lxml.etree.parse('big.xml')
et.xpath('//prop[@key="sense:ukb:syns_id"]/text()')
在您的样本上,这会产生:
['1358', '35864']
(虽然请注意字符串实际上是
lxml.etree._ElementUnicodeResult
的实例,它是str
)