2017-11-11 189 views
1

我在使用python解析XML文件時遇到問題,即 - 語法。在python中使用cElementTree解析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 
+0

所以你要只捕獲1號標籤''''標籤中? – RomanPerekhrest

+0

我想在每個「」中捕獲''和''並將其保存爲元組。 – AwangardowyKaloryfer

+0

''總是存在,但如果沒有'',我可以使用0. – AwangardowyKaloryfer

回答

1

隨着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')迭代 - 將得到<orth>標籤withing當前處理<tok>標籤的文本內容
  • tok.findtext('prop[@key="sense:ukb:syns_id"]') or 0 - 獲得<prop>標籤與指定key屬性的文本內容。如果它不存在 - 離開值爲零0
+0

我一直在嘗試做這個工作的時間,這是做的。上帝保佑你,先生。你想解釋一下嗎? – AwangardowyKaloryfer

+0

@AwangardowyKaloryfer,不客氣。看到我的細節 – RomanPerekhrest