在 python 中使用 cElementTree 解析 XML
parsing XML using cElementTree in python
我在使用 python 解析 XML 文件时遇到问题,即 - 语法。
我的 XML 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chunkList SYSTEM "ccl.dtd">
<chunkList>
<chunk id="ch1" type="p">
<sentence id="s1">
<tok>
<orth>dzisiaj</orth>
<lex disamb="1"><base>dzisiaj</base><ctag>adv:pos</ctag></lex>
</tok>
<tok>
<orth>uczę</orth>
<lex disamb="1"><base>uczyć</base><ctag>fin:sg:pri:imperf</ctag></lex>
<prop key="sense:ukb:syns_id">1449</prop>
<prop key="sense:ukb:syns_rank">1449/0.3151019143 52662/0.2635524432 58124/0.2227816629 58122/0.1985639796</prop>
<prop key="sense:ukb:unitsstr">szkolić.1(29:cumy) nauczać.1(29:cumy) kształcić.1(29:cumy) edukować.1(29:cumy) uczyć.1(29:cumy)</prop>
</tok>
<tok>
<orth>się</orth>
<lex disamb="1"><base>się</base><ctag>qub</ctag></lex>
</tok>
<tok>
<orth>o</orth>
<lex disamb="1"><base>o</base><ctag>prep:acc</ctag></lex>
</tok>
<tok>
<orth>świecie</orth>
<lex disamb="1"><base>świat</base><ctag>subst:sg:loc:m3</ctag></lex>
<prop key="sense:ukb:syns_id">7826</prop>
<prop key="sense:ukb:syns_rank">7826/0.1761356163 43462/0.1512730526 8139/0.1506959982 8361/0.1446884158 3331/0.1435643398 10819/0.1251661757 3332/0.1084764017</prop>
<prop key="sense:ukb:unitsstr">cywilizacja.1(11:grp) krąg_kulturowy.1(11:grp) kultura.3(11:grp) krąg_cywilizacyjny.1(17:rsl) świat.2(11:grp)</prop>
</tok>
</sentence>
</chunk>
</chunkList>
而我需要的是一个包含具有两个值 <orth>
和 <prop key="sense:ukb:syns_id">
的元组的列表。每个元组对应每个 <tok>
标签。所以,例如第二个 <tok>
我需要一个像 (uczę, 1449)
.
这样的结果
我已经编写了关于我认为它应该如何工作的伪代码,但我不知道如何使用 ET 来实现它。
这里是:
ResultArray=[]
def treeSearch(root):
for element in root:
if element == 'tok':
temp1=0
temp2=0
for tokens in element:
if token == 'orth':
temp1=token.value()
if token == 'prop key="sense:ukb:syns_id"':
temp2=token.value()
tempTuple=(temp1,temp2)
resultArray.append(tempTuple)
return ResultArray
使用 xml.etree.ElementTree
模块:
import xml.etree.ElementTree as ET
root = ET.parse('input.xml').getroot()
result = []
for tok in root.findall('.//tok'):
result.append((tok.findtext('orth'), tok.findtext('prop[@key="sense:ukb:syns_id"]') or 0))
print(result)
输出:
[('dzisiaj', 0), ('uczę', '1449'), ('się', 0), ('o', 0), ('świecie', '7826')]
详情:
for tok in root.findall('.//tok'):
- 遍历所有 <tok>
个标签
tok.findtext('orth')
- 将使用当前处理的 <tok>
标签 获取 <orth>
标签的文本内容
tok.findtext('prop[@key="sense:ukb:syns_id"]') or 0
- 获取具有指定 key
属性的 <prop>
标签的文本内容。如果不存在 - 将值保留为零 0
我在使用 python 解析 XML 文件时遇到问题,即 - 语法。
我的 XML 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chunkList SYSTEM "ccl.dtd">
<chunkList>
<chunk id="ch1" type="p">
<sentence id="s1">
<tok>
<orth>dzisiaj</orth>
<lex disamb="1"><base>dzisiaj</base><ctag>adv:pos</ctag></lex>
</tok>
<tok>
<orth>uczę</orth>
<lex disamb="1"><base>uczyć</base><ctag>fin:sg:pri:imperf</ctag></lex>
<prop key="sense:ukb:syns_id">1449</prop>
<prop key="sense:ukb:syns_rank">1449/0.3151019143 52662/0.2635524432 58124/0.2227816629 58122/0.1985639796</prop>
<prop key="sense:ukb:unitsstr">szkolić.1(29:cumy) nauczać.1(29:cumy) kształcić.1(29:cumy) edukować.1(29:cumy) uczyć.1(29:cumy)</prop>
</tok>
<tok>
<orth>się</orth>
<lex disamb="1"><base>się</base><ctag>qub</ctag></lex>
</tok>
<tok>
<orth>o</orth>
<lex disamb="1"><base>o</base><ctag>prep:acc</ctag></lex>
</tok>
<tok>
<orth>świecie</orth>
<lex disamb="1"><base>świat</base><ctag>subst:sg:loc:m3</ctag></lex>
<prop key="sense:ukb:syns_id">7826</prop>
<prop key="sense:ukb:syns_rank">7826/0.1761356163 43462/0.1512730526 8139/0.1506959982 8361/0.1446884158 3331/0.1435643398 10819/0.1251661757 3332/0.1084764017</prop>
<prop key="sense:ukb:unitsstr">cywilizacja.1(11:grp) krąg_kulturowy.1(11:grp) kultura.3(11:grp) krąg_cywilizacyjny.1(17:rsl) świat.2(11:grp)</prop>
</tok>
</sentence>
</chunk>
</chunkList>
而我需要的是一个包含具有两个值 <orth>
和 <prop key="sense:ukb:syns_id">
的元组的列表。每个元组对应每个 <tok>
标签。所以,例如第二个 <tok>
我需要一个像 (uczę, 1449)
.
我已经编写了关于我认为它应该如何工作的伪代码,但我不知道如何使用 ET 来实现它。
这里是:
ResultArray=[]
def treeSearch(root):
for element in root:
if element == 'tok':
temp1=0
temp2=0
for tokens in element:
if token == 'orth':
temp1=token.value()
if token == 'prop key="sense:ukb:syns_id"':
temp2=token.value()
tempTuple=(temp1,temp2)
resultArray.append(tempTuple)
return ResultArray
使用 xml.etree.ElementTree
模块:
import xml.etree.ElementTree as ET
root = ET.parse('input.xml').getroot()
result = []
for tok in root.findall('.//tok'):
result.append((tok.findtext('orth'), tok.findtext('prop[@key="sense:ukb:syns_id"]') or 0))
print(result)
输出:
[('dzisiaj', 0), ('uczę', '1449'), ('się', 0), ('o', 0), ('świecie', '7826')]
详情:
for tok in root.findall('.//tok'):
- 遍历所有<tok>
个标签tok.findtext('orth')
- 将使用当前处理的<tok>
标签 获取 tok.findtext('prop[@key="sense:ukb:syns_id"]') or 0
- 获取具有指定key
属性的<prop>
标签的文本内容。如果不存在 - 将值保留为零0
<orth>
标签的文本内容