gpt4 book ai didi

Python:在 xml 中,如何删除父节点中的节点

转载 作者:太空宇宙 更新时间:2023-11-04 03:41:51 53 4
gpt4 key购买 nike

我有一个相当大的 xml,我需要从中删除另一个节点中的一些特定节点。例如我有一个列表,其中包含应该出现在 xml 中的节点名称。因此,除了这些节点之外,父节点中的所有其他节点都应删除并写入新的 xml 文件。

我只需要删除节点,即“Instance”,其中第一个“Data”元素不等于列表中存在的值,我将提供。其余的 xml 信息,即“Description”、“Symbols”标签不应受到干扰。

假设:我已经将应该从外部文件读取的数据解析为python列表变量。

DOM 或 SAX 任何人都适合我。但我相信 DOM 非常快。对任何 BIF 的可用或逻辑的任何提示对我来说也没有问题。

注意:我是 Python 的新手。因此,如果我的代码有任何问题,请发表评论。

我的代码如下:

from xml.etree.ElementTree import ElementTree
tree = ElementTree()
tree.parse('Test.xml')

file = open("File.txt")

list = []

for lines in file:
list.append(lines)

Instance = tree.findall('Instance')
for i in Instance:
while (i != list[i]):
Instance.remove(i)

tree.write('new.xml')

下面是示例 xml 文件:

<?xml version='1.0' encoding='UTF-8'?>
<Identification>
<Description ID="12">Some text</Description>
</Identification>
<Symbols>
<Name Width="1">abc</Name>
<Name Width="2">def</Name>
</Symbols>

<Instance RowRef="A">
<DataSet>
<Data>12345678</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
</Instance>
<Instance RowRef="B">
<DataSet>
<Data>87654321</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
</Instance>
<Instance RowRef="C">
<DataSet>
<Data>06354237/Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>

最佳答案

你对很多点感到困惑。

首先,您提供的 xml 缺少根标记。您的 xml 文件应该看起来更像这样(其中 Root 可以替换为任何必要的标记):

<?xml version='1.0' encoding='UTF-8'?>
<Root>
<Identification>
<Description ID="12">Some text</Description>
</Identification>
<Symbols>
<Name Width="1">abc</Name>
<Name Width="2">def</Name>
</Symbols>

<Instance RowRef="A">
<DataSet>
<Data>12345678</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
</Instance>
<Instance RowRef="B">
<DataSet>
<Data>87654321</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
</Instance>
<Instance RowRef="C">
<DataSet>
<Data>06354237</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
</Instance>
</Root>

其次,如果您担心速度,请考虑使用cElementTree 而不是ElementTree:

>>> import xml.etree.cElementTree as ET  # use cElementTree for faster processing

第三,需要给ET.parse方法的结果起个名字,不然以后就没有办法引用了:

>>> tree = ET.parse('Test.xml')

第四,现在您需要找到该树的根,然后才能找到该树的所有 Instance 元素:

>>> root = tree.getroot()  # now get the root
>>> keeper_data = ['06354237', '87654321'] # your list that you will apparently get from a file?
>>> instances = root.findall('Instance')

现在您需要找到 Instance 元素,其 Data 值指示应删除 Instance 元素:

第五,你需要检查第一个Data元素的文本是否在你的keeper列表中,第六,你root(或任何父元素)中移除您的元素,而不是从 instances 中移除:

>>> for instance in instances:
data1 = instance.find('./DataSet/Data')
if data1.text not in keeper_data:
# NOTE WELL: I remove from the root (not the instance) below!
root.remove(instance)

现在写入您的新 xml 文件:

>>> tree.write('New.xml')

生成的 xml 文件将如下所示:

<Root>
<Identification>
<Description ID="12">Some text</Description>
</Identification>
<Symbols>
<Name Width="1">abc</Name>
<Name Width="2">def</Name>
</Symbols>
<Instance RowRef="B">
<DataSet>
<Data>87654321</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
</Instance>
<Instance RowRef="C">
<DataSet>
<Data>06354237</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
<DataSet>
<Data>abcd</Data>
</DataSet>
</Instance>
</Root>

请注意,具有值为 12345678 的 Data 元素的 Instance 和其他 keeper_data 元素均未被省略。

关于Python:在 xml 中,如何删除父节点中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26078225/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com