2016-06-29 2 views
1

なぜelement.find("..")返信rootroot.findall("*")elementを返しますか? XMLファイルのpython xml - find( "..")がルートを返さない理由

def XML_Extract_Node_Tags(Tree, Node_Tags): 
    """ 
    :param Tree: xml.etree.ElementTree 
    :param Node_Tags: list 
    :return: ReturnVal: 
    """ 

    for el in Tree.findall("//"): 
     if el.tag not in Node_Tags: 
      print(el.tag) 
      # Need to remove the element and set its children equal to parent 
      for subel in el.findall("*"): 
       ## Add subel to grandparent (if exists) 
       grand_parent = subel.find('../..') 
       if grand_parent: 
        # If it has a grand parent 
        grand_parent.append(subel) 
      # Remove el from tree 
      if not el.find(".."): 
       print(el.tag, el.attrib) 
      else: 
       el.find("..").remove(el) 

    ReturnVal = Tree 
    return ReturnVal 

第5ライン

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE build SYSTEM "build.dtd"> 
<build id="58" localAgents="true" cm="usl000348:80" start="6/1/2016 3:31:19 PM"> 
<properties> 
<property name="CommandLine">emake all --emake-annodetail=waiting,registry,md5,lookup,history,file,env --emake-annofile=../Emake-2agents-1st.xml --emake-root=../</property> 
+0

'el.find( '..')'は、この要素のすべての子要素で、親を見つけますか?要素の親ではなく、要素自体を指すのではないでしょうか? –

+0

@JohnGordon touche。はい、あなたは正しい:[最初の**サブ要素**一致するマッチを検索する](https://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find ) – Adrian

+0

も参照してください:http://stackoverflow.com/questions/2170610/access-elementtree-node-parent-node –

答えて

2

Pythonのxml.etree.ElementTree実装はElementの親を記録しません。その結果、the documentation for XPathには次の情報が含まれます。

..親要素を選択します。パスが開始要素の祖先に到達しようとすると、Noneを返します(要素findは呼び出されました)。

+0

'lxml.etree.ElementTree'は親を追跡し、よい選択肢かもしれません。私はOPの構文をテストし、期待どおりに動作します。 –

+0

私は自分の答えにその情報を追加しようとしていましたが、正しい単語を見つけて正しい文書リンクを見つけることができませんでした。あなたが望むなら、自由に編集してください。 –

関連する問題