使用Python LXML删除XML元素值但保留一个占位符

时间:2017-01-12 14:39:04

标签: python xml lxml

我有一个XML文件,我希望清除'值'中的文字。子元素,但保留一个空值元素作为占位符,以便在以后添加文本。我正在使用Python的LXML模块。

以下是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>A</value>
            <value>B</value>
            <value>C</value>
        </pool>

        <pool class="String" name="Target">
            <value>D</value>
            <value>E</value>
            <value>F</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></value>
        </pool>

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

我编写了以下代码,但它只将&#34;值&#34; 标记添加到最后一个元素:

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 个答案:

答案 0 :(得分:1)

我会删除所有value元素并在一个循环中追加一个空元素:

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)