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はすでに子に到達するための多くの方法を提供しているため、子を追跡することはおそらく過剰です。

子リストに組み込まれているlxmlを使用する方法は次のとおりです。

 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

答えが見つかりました。root[n]経由でアクセスしようとするのではなく、Python配列参照を使用する必要がありますlist_0

于 2012-11-22T02:10:13.273 に答える