2012-11-22 98 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