3

基本问题 - 当你建造一棵树时,你如何在树中“移动”。

我可以填充第一级:

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 构建器“指向”作为父母的孩子,并编写一个新的孩子?

4

2 回答 2

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) )
于 2012-11-22T02:07:00.290 回答
0

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

于 2012-11-22T02:10:13.273 回答