2012-11-22 44 views
2

基本問題 - 當您構建樹時,如何在樹中「移動」。Python - lxml - 構建樹時如何在樹周圍「移動」

我可以填充第一級:

import lxml.etree as ET 

def main(): 
    root = ET.Element('baseURL') 
    root.attrib["URL"]='www.com' 
    root.attrib["title"]='Level Title' 
    myList = [["www.1.com","site 1 Title"],["www.2.com","site 2 Title"],["www.3.com","site 3 Title"]] 
    for i in xrange(len(myList)): 
     ET.SubElement(root, "link_"+str(i), URL=myList[i][0], title=myList[i][1]) 

這給了我喜歡的東西:

baseURL: 
     link_0 
     link_1 
     link_2 

從那裏,我想從每個新節點的添加一個子樹,所以它看起來什麼像:

baseURL: 
     link_0: 
       link_A 
       link_B 
       link_C 
     link_1 
     link_2 

我看不到如何「點」的子元素調用到下一個節點下來 - 我想:

myList2 = [["www.A.com","site A Title"],["www.B.com","site B Title"],["www.C.com","site C Title"]] 
for i in xrange(len(myList2)): 
     ET.SubElement('link_0', "link_"+str(i), URL=myList2[i][0], title=myList2[i][1]) 

但拋出的錯誤:

TypeError: Argument '_parent' has incorrect type (expected lxml.etree._Element, got str)

因爲我給子元素調用一個字符串,而不是一個元素的參考。我也試過它作爲一個變量(即link_0' rather than「link_0」`),並給出了一個全局缺失變量,所以我的引用顯然是不正確的。

如何將我的lxml構建器作爲父項指向孩子,然後編寫新的孩子?

+0

無關:您可以[使用TreeBuilder和標記模塊的縮進文本構建xml樹](http://stackoverflow.com/a/12166627//4279) – jfs

回答

1

ET.SubElement(parent_node,type)創建一個新的XML元素節點作爲parent_node的子節點。它也返回這個新節點。

所以,你可以這樣做:

import lxml.etree as ET 

def main(): 
    root = ET.Element('baseURL') 
    myList = [1,2,3] 
    children = [] 
    for x in myList: 
    children.append(ET.SubElement(root, "link_"+str(x))) 

    for y in myList: 
    ET.SubElement(children[0], "child_"+str(y)) 

但保持孩子的軌跡可能是因爲過多已經LXML爲您提供了許多方法來得到他們。

下面是使用內置的兒童名單lxmls方式:

node = root[0] 
for y in myList: 
    ET.SubElement(node, "child_"+str(y)) 

下面是使用XPath(可能更好,如果你的XML是越來越難看)找到了答案的方式

node = root.xpath("/baseURL/link_0")[0] 
for y in myList: 
    ET.SubElement(node, "child_"+str(y)) 
+0

謝謝。我剛剛(即將)得出答案,但你的(顯然)更完整,而且非常有用。我感謝你的時間! –

0

。我應該使用蟒蛇陣列參考,root[n]不試圖去通過list_0