gpt4 book ai didi

python - 使用 elementTree 和 .remove() 使用 Python 删除 XML 子元素标签

转载 作者:数据小太阳 更新时间:2023-10-29 02:16:06 25 4
gpt4 key购买 nike

我需要帮助使用 Python 和 elementTree 库调整我的 XML 文件。

对于某些背景,我不是学生而是在工业界工作。我希望通过使这些更改自动化来节省大量手动工作,通常我会使用我更熟悉的语言(例如 C++)来完成此操作。但是,在我的小组中有人插入使用 Python,因此我将其用作功能练习和学习练习。

您能否纠正我对术语的使用和理解?我不只是希望代码能够工作,而是要知道我对其工作方式的理解是正确的。

问题本身:

目标:从 XML 文件中删除子元素“weight”。

使用 xml 代码(假设它被称为“example.xml”):

<XML_level_1 created="2014-08-19 16:55:02" userID="User@company">
<XML_level_2 manufacturer="company" number="store-25235">
<padUnits value="mm" />
<partDescription value="Part description explained here" />
<weight value="5.2" />
</XML_level_2>
</XML_level_1>

到目前为止,我有以下代码:

from xml.etree import ElementTree

current_xml_tree = ElementTree.parse(filename_path) # Path to example.xml

current_xml_root = current_xml_tree.getroot()
current_xml_level_2_node = current_xml_root.findall('XML_level_2')

# Extract "weight" value for later use
for weight_value_elem in current_xml_root.iter('weight'):
weight_value = weight_value_elem.get('value')

# Remove weight sub-element from XML
# -------------------------------------

# Get all nodes entitled 'weight' from element
weight_nodes = current_xml_root.findall('weight')
print weight_nodes # result is an empty list

print weight_value_elem # Location of element 'weight' is listed

for weight_node_loc in current_xml_tree.iter('weight'):
print "for-loop check : loop has been entered"

current_xml_tree.getroot().remove(weight_value_elem)
print "for-loop has been processed"

print "Weight line removed from ", filename_path

# Write changes to XML File:
current_xml_tree.write(filename_path)

我已阅读 this helpful resource , 但已经到了我卡住的地步。

第二个问题:节点和元素在这个上下文中是什么关系?

我来自有限元背景,其中节点被理解为元素的一部分,定义了创建元素的部分/角边界。但是,我是否认为这里使用的术语不同,节点不是元素的子集,这是错误的吗?这两个术语是否仍然以类似的方式相关?

最佳答案

从树中删除一个元素,无论它在树中的位置如何,ElementTree API 都会不必要地复杂化。具体来说,没有元素知道自己的父元素,因此我们必须“手动”发现这种关系。

from xml.etree import ElementTree
XML = '''
<XML_level_1 created="2014-08-19 16:55:02" userID="User@company">
<XML_level_2 manufacturer="company" number="store-25235">
<padUnits value="mm" />
<partDescription value="Part description explained here" />
<weight value="5.2" />
</XML_level_2>
</XML_level_1>
'''

# parse the XML into a tree
root = ElementTree.XML(XML)

# Alternatively, parse the XML that lives in 'filename_path'
# tree = ElementTree.parse(filename_path)
# root = tree.getroot()

# Find the parent element of each "weight" element, using XPATH
for parent in root.findall('.//weight/..'):
# Find each weight element
for element in parent.findall('weight'):
# Remove the weight element from its parent element
parent.remove(element)

print ElementTree.tostring(root)

如果可以切换到lxml ,循环稍微不那么麻烦:

for weight in tree.findall("//weight"):
weight.getparent().remove(weight)

关于你的第二个问题,the ElementTree documentation “节点”或多或少可以与“元素”互换使用。更具体地说,它似乎使用“节点”一词来指代“元素”类型的 Python 对象或此类对象所指的 XML 元素。

关于python - 使用 elementTree 和 .remove() 使用 Python 删除 XML 子元素标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37335943/

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