基本问题 - 在构建树时,如何在树中“移动”。
我可以填充第一级:
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构建器指向一个孩子作为父母,并写一个新的孩子?
答案 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