我有多个大文件需要导入并遍历它们——它们都是 xmls 并且具有相同的树结构。结构是这样的,除了 ID 之外还有一些额外的文本,所以在 Start 下有更多的子元素标签:我想做的是输入一个我知道是错误的 Id 列表,然后从整个 XML 文件。一份报告在两个“T”之间。
<Header>
<Header2>
<Header3>
<T>
<Start>
<Id>abcd</Id>
</Start>
</T>
<T>
<Start>
<Id>qrlf</Id>
</Start>
</T>
</Header3>
</Header2>
</Header>
到目前为止我所拥有的:
from xml.etree import cElementTree as ET
file_path = '/path/to/my_xml.xml'
to_remove = []
root = None
for event, elem in ET.iterparse(file_path, events=("start", "end")):
if event == 'end':
if elem.tag == 'Id':
new_root = elem
#print([elem.tag for elem in new_root.iter()])
for elem2 in new_root.iter('Id'):
id = elem2.text
if id =='abcd':
print(id)
to_remove.append(new_root)
root = elem
for item in to_remove:
root.remove(item)
因此,上面的代码显然不起作用,因为根是以 Header 开头的整个 xml 文件,并且它无法准确找到我所指的删除子元素,因为它的父级是 Header3 而不是 Header。
所以所需的输出将是:
<Header>
<Header2>
<Header3>
<T>
<Start>
<Id>qrlf</Id>
</Start>
</T>
</Header3>
</Header2>
</Header>
展望未来,我要输入删除的不是单个值,而是数千个值,所以要成为一个列表,我只是认为以这种方式表示问题更容易。任何帮助表示赞赏。