【问题标题】:Python : Remove an element but not its children from xml?Python:从 xml 中删除一个元素而不是它的子元素?
【发布时间】:2021-04-27 14:07:59
【问题描述】:

我想删除元素而不是它的子元素。我尝试使用此代码,但我的代码也删除了它的子代。

代码

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml')
root = tree.getroot()

for item in root.findall('item'):
    root.remove(item)

print(ET.tostring(root))
>>> <root>
    </root>

test.xml

<?xml version="1.0" ?>
<root>
    <item>
        <data>
            <number>01</number>
            <step>one</step>
        </data>
    </item>
</root>

预期结果

<?xml version="1.0" ?>
<root>
    <data>
        <number>01</number>
        <step>one</step>
    </data>
</root>

【问题讨论】:

    标签: python xml element children


    【解决方案1】:

    您应该在删除之前将item 的所有子级移动到root

    for item in root.findall('item'):
        for child in item:
            root.append(child)
        root.remove(item)
    
    print(ET.tostring(root))
    

    代码结果

    <root>
       <data>
           <number>01</number>
           <step>one</step>
       </data>
    </root>
    

    【讨论】:

      【解决方案2】:

      找到带有data标签的元素,删除它并用元素的子元素扩展元素的父元素。

      import xml.etree.ElementTree as etree
      
      data = """
      <root>
          <item>
              <data>
                  <number>01</number>
                  <step>one</step>
              </data>
          </item>
      </root>
      """
      
      tree = etree.fromstring(data)
      
      def iterparent(tree):
          for parent in tree.iter():
              for child in parent:
                  yield parent, child
      
      tree = etree.fromstring(data)
      for parent, child in iterparent(tree):
          if child.tag == "data":
              parent.remove(child)
              parent.extend(child)
      
      print((etree.tostring(tree)))
      

      会输出

      <root>
          <item>
              <number>01</number>
              <step>one</step>
          </item>
      </root>
      

      根据您的特定用例改编自 a similar answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        相关资源
        最近更新 更多