简体   繁体   English

使用 python 中的元素树删除特定数量的具有相同标签和属性值的 XML 元素

[英]Remove specific numbers of XML elements having same tags and attribute values using Element tree in python

I have below XML elements from which I want to remove the only 2 of the Item tag from each Flagelemnts and Fav elements using the element tree in Python.我有以下 XML 元素,我想使用 Python 中的元素树从每个 Flagelemnts 和 Fav 元素中删除仅有的 2 个 Item 标签。

<Flagelements>
   <Item Flags="0" />
   <Item Flags="0" />
   <Item Flags="0" />
   <Item Flags="0" />
</Flagelements>
<Fav>
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
</Fav>

It's a huge file of XML and I have tried below Code to do the Same.这是 XML 的一个巨大文件,我尝试在下面的代码中做同样的事情。

for child in root:
    count=0
    for ch in child:
        for i in ch:
            i.attrib['GUID']=='4df88cf7d0da00000b30927e000007':
            if i.tag == 'Item':
                print(i.tag, i.attrib)
                count=count+1
                if count< 1:
                    ch.remove(i)

But it's removing all of the tags with Item tag.但它正在删除所有带有 Item 标签的标签。

Also, I have tried below code with.findall method另外,我尝试了下面的代码 with.findall 方法

for item in root.findall(".//Fav/Item"):
    count=count+1
    if count<3:
        print(item.tag)
        item.getparent().remove(item)

But, it's throwing a below error:但是,它抛出了以下错误:

'xml.etree.ElementTree.Element' object has no attribute 'getparent' 'xml.etree.ElementTree.Element' object 没有属性 'getparent'

Let me know How I can Do the Same.让我知道如何做同样的事情。

Thanks in advance.提前致谢。

Sambhawam桑巴万

Something like this:像这样的东西:

import xml.etree.ElementTree as ET

xml = '''<r><Flagelements>
   <Item Flags="0" dummy="1" />
   <Item Flags="0" dummy="2" />
   <Item Flags="0" dummy="3" />
   <Item Flags="0" dummy="4" />
</Flagelements>
<Fav>
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
</Fav></r>'''

root = ET.fromstring(xml)
flag_elements = root.findall('.//Flagelements')
for fe in flag_elements:
    items = fe.findall('./Item')
    for idx,item in enumerate(items):
        if idx < 2:
            fe.remove(item)
ET.dump(root)

output output

<r><Flagelements>
   <Item Flags="0" dummy="3" />
   <Item Flags="0" dummy="4" />
</Flagelements>
<Fav>
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
   <Item ShareWhenSavedAsFav="255" />
</Fav></r>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM