Python - lxml - 在构建树时如何在树周围“移动”

时间:2012-11-22 01:50:32

标签: 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

我无法看到如何将subElement调用“指向”下一个节点 - 我试过了:

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)

因为我给subElement调用一个字符串,而不是元素引用。我也把它作为一个变量,(即link_0' rather than“link_0”`)并且它给出了一个全局缺失变量,所以我的引用显然是不正确的。

我如何将我的lxml构建器指向一个孩子作为父母,并写一个新的孩子?

2 个答案:

答案 0 :(得分: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) )

答案 1 :(得分:0)

找到答案。我应该使用python数组引用,root[n]不要试图通过list_0

来访问它