2016-09-29 74 views
0

我有下面的XML文件來得到一個完整的標籤:解析XML文件使用Python的lxml的包

<root> 

    <scene name="scene1"> 
     <view ath="0" atv="10"/> 
     <image url="img1.jgp"/> 
     <hotspot name="hot1"/> 
    </scene> 

    <scene name="scene2"> 
     <view ath="20" atv="10"/> 
     <image url="img2.jgp"/> 
     <hotspot name="hot2"/> 
    </scene> 

</root> 

我使用LXML包編寫Python腳本,讓整個view標籤在scene1之內。那就是:

<view ath="0" atv="10" /> 

我讀過LXML文件,但所有我能找到的是如何得到的標籤,它的屬性或它的內容,而不是整個標籤。

任何人都可以至少指出我在正確的方向嗎? lxml是否有一個函數或方法來實現這一點?

感謝,

拉斐爾

+0

解析文件用'lxml.etree; parse',使用XPath表達式來搜索您元件(多個),請參見:[XPath和XSLT與LXML](http://lxml.de/xpathxslt.html#the-xpath-method)。用lxml.etree.tostring序列化結果。 –

+0

注意:我編輯了你的XML樣本,因爲它是無效的。等待審查的同行... –

回答

0

XML內容是這樣的字符串:

content = u"""\ 
<root> 

    <scene name="scene1"> 
     <view ath="0" atv="10"/> 
     <image url="img1.jgp"/> 
     <hotspot name="hot1"/> 
    </scene> 

    <scene name="scene2"> 
     <view ath="20" atv="10"/> 
     <image url="img2.jgp"/> 
     <hotspot name="hot2"/> 
    </scene> 

</root> 
""" 

你可以解析一個文件;但是,在這裏,我分析一個StringIO的:

tree = etree.parse(io.StringIO(content)) 

一切都在一個ElementTree加載。

要查找的意見,我用XPath表達式:

views = tree.xpath("//scene/view") 

的結果總是一個列表:

for view in views: 
    print(etree.tostring(view, with_tail=False)) 

您將獲得:

<view ath="0" atv="10"/> 
<view ath="20" atv="10"/> 
0

你給出XML源代碼包含一些錯誤;我固定的,看我下面的源:

from lxml import etree 

source = """ 
<root> 
    <scene name="scene1"> 
    <view ath="0" atv="10" /> 
    <image url="img1.jgp" /> 
    <hotspot name="hot1" /> 
    </scene> 

    <scene name="scene2"> 
    <view ath="20" atv="10" /> 
    <image url="img2.jgp" /> 
    <hotspot name="hot2" /> 
    </scene> 
</root> 
""" 

解析這個源,將創建一個etree:(對於源從一個文件來,用etree.parse()代替)

tree = etree.fromstring(source) 

現在,您可以通過正確訪問tree來瀏覽已解析的XML。我最喜歡這樣的方式是用XPath進行導航(掌握這些超出你的問題的範圍):

allViews = tree.xpath('//root/scene/view') 
for view in allViews: 
    print view.attrib 

這將打印的XPath找到的每個視圖標籤的所有XML屬性:

{'atv': '10', 'ath': '0'} 
{'atv': '10', 'ath': '20'} 

當然,你也可以訪問視圖元素的其他屬性,比如嵌入文本(當然這裏是空的)或者它們的子元素(子元素)(當然,在你的例子中他們也沒有子元素)。

你的問題的措辭表明,你可能沒有建立一個事實,即這個view對象確實是「整個視圖標記」的理解。您可以詢問view對象的標籤(view),其屬性(參見上文),其內容(view.text)及其子元素(view.getchildren(),但沒有)。

您可以通過調用etree.tostring(view)將解析的XML結構轉換回ASCII表示形式;這將返回一個字符串,如'<view ath="20" atv="10"/>\n '。在大多數情況下,你不會這樣做。

您也可以訪問元素元素來查看孩子:

print tree.getchildren()[1].getchildren()[0].attrib 

這將打印XML第0孩子的第一個孩子tree元素的屬性(一view)(一scene) :

{'atv': '10', 'ath': '20'}