2017-03-24 73 views
0

我在解析下面的xml文件時遇到了問題。這是我的嘗試;應用元素樹來分析複雜的xml結構

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<corpus name="P4P" version="1.0" lng="en" xmlns="http://clic.ub.edu/mbertran/formats/paraphrase-corpus" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://clic.ub.edu/mbertran/ 
formats/paraphrase-corpus http://clic.ub.edu/mbertran/formats/paraphrase-corpus.xsd"> 
    <snippets> 
     <snippet id="16488" source_description="type:plagiarism;plagiarism_reference:00061; 
     offset:47727;length:182;source:P4P;wd_count:37"> 
     All art is imitation of nature. 
     </snippet> 

    </snippets> 
</corpus> 

import xml.etree.ElementTree 
#root=xml.etree.ElementTree.parse("C:\\Users\\P4P_corpus\\P4P_corpus_v1.xml").getroot() 
source=root.findall('snippets/snippet') 
for details in source.findall: 
    print details.get('source_description') 
    print details.findtext 

我的輸出是空

我想要的輸出:

"type:plagiarism;plagiarism_reference:00061; 
     offset:47727;length:182;source:P4P;wd_count:37" 

All art is imitation of nature.

我會很感激你的建議離子。

+0

我不相信你的輸出是空的代碼張貼。 snippets snipet至少會引發錯誤。 –

+0

@MadPhysicist,對不起,我把斜槓錯了,我現在編輯這個問題。但是,這是我得到的結果。 – Boby

回答

0

您需要將元素前綴爲xml名稱空間。如果您解析後打印根你會得到

<Element '{http://clic.ub.edu/mbertran/formats/paraphrase-corpus}corpus' at 0x7ff7891f6390> 
      ^  this part here is the full name      ^

所以遍歷「片斷」你先找到「片斷」元素和「片斷」元素

for snippets in root.findall('{http://clic.ub.edu/mbertran/formats/paraphrase-corpus}snippets'): 
    for s in snippets.findall('{http://clic.ub.edu/mbertran/formats/paraphrase-corpus}snippet'): 
     print s.get('source_description') 

你可以閱讀有關處理組件命名空間@https://docs.python.org/2/library/xml.etree.elementtree.html#parsing-xml-with-namespaces

+0

很好的解決方案,它的工作。非常感謝。 – Boby