2017-01-12 8 views
0

私は 'value'子要素のテキストをクリアしたいが、1つの空の値要素を後日。私はPythonのLXMLモジュールを使用しています。ここでPython LXMLを使用してXML要素の値を削除するが、1つのプレースホルダを残す

は、XMLセクションの例です:私は、次のコードを書かれている

<spec class="Spec" name="New Test"> 
    <mainreport> 
     <item name="New Item">First Item</item> 
    </mainreport> 

    <case class="CaseItem" name="Some Name"> 
     <extraelement> 
      <item name="ID">Some Id</item> 

     </extraelement> 

     <pool class="String" name="Originator"> 
      <value></value> 
     </pool> 

     <pool class="String" name="Target"> 
      <value></value> 
     </pool> 

が、それは唯一の「の値を追加します。

<spec class="Spec" name="New Test"> 
    <mainreport> 
     <item name="New Item">First Item</item> 
    </mainreport> 

    <case class="CaseItem" name="Some Name"> 
     <extraelement> 
      <item name="ID">Some Id</item> 

     </extraelement> 

     <pool class="String" name="Originator"> 
      <value>A</value> 
      <value>B</value> 
      <value>C</value> 
     </pool> 

     <pool class="String" name="Target"> 
      <value>D</value> 
      <value>E</value> 
      <value>F</value> 
     </pool> 

そして、ここでは、私が出力に期待しています何最後の要素へのタグ:

import lxml.etree as et 
import os 

xml_match = os.path.join("input.xml") 
doc = et.parse(xml_match) 

for elem in doc.xpath('//case/pool/value'): 
    elem.getparent().remove(elem) 

blankval = et.Element("value") 
blankval.text = "" 

for elem in doc.xpath('//case/pool'): 
    elem.insert(1, blankval) 

outFile = "output.xml" 

doc.write(outFile) 

答えて

1

私はすべてのvalueの要素を削除し、単一のループに空の1を追加します:

for elem in doc.xpath('//case/pool'): 
    for value in elem.findall("value"): 
     elem.remove(value) 

    blankval = et.Element("value") 
    blankval.text = "" 
    elem.append(blankval) 

は便利.clear() methodもありますが、それはまた、属性をクリアします。


あなたはまったく同じblankval要素を再利用しようとしているので、あなたの現在のアプローチは機能していない理由はあるが、代わりに、あなたは挿入操作を実行する前に、ループ内で新しい要素を再作成する必要があります。

for elem in doc.xpath('//case/pool'): 
    blankval = et.Element("value") 
    blankval.text = "" 
    elem.insert(1, blankval) 
+0

助けてくれてありがとう@alecxe、これは今や理にかなっています。あなたが言うように、そして皮肉なことに、私はこのプロセスを2つのループに分割して作業を単純化しようとしていました。実際には私の最初の試みが妨げられました。 – MikG

関連する問題