我一直在使用python和ElementTree来操作相当大的xml文件,成功率参差不齐。我发现我很难移除多个元素,尤其是当它们是根的子元素时。如果我有4个编号为1-4的元素,那么只有1和3将使用“forelem in root”子句删除。在
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<CrossDEV culture-info="en-US" platform-version="2.40.8" product-version="2.40.8">
<MyStuff.Interface.Common.Objects.ActionItem ImportMode="Default">
<TargetObjectKey>FOOSTUFF1</TargetObjectKey>
</MyStuff.Interface.Common.Objects.ActionItem>
<MyStuff.Interface.Common.Objects.ActionItem ImportMode="Default">
<TargetObjectKey>FOOSTUFF2</TargetObjectKey>
</MyStuff.Interface.Common.Objects.ActionItem>
<MyStuff.Interface.Common.Objects.ActionItem ImportMode="Default">
<TargetObjectKey>FOOSTUFF3</TargetObjectKey>
</MyStuff.Interface.Common.Objects.ActionItem>
<MyStuff.Interface.Common.Objects.ActionItem ImportMode="Default">
<TargetObjectKey>FOOSTUFF4</TargetObjectKey>
</MyStuff.Interface.Common.Objects.ActionItem>
</CrossDEV>
代码:
^{2}$在上面的代码中,我在孙辈中搜索特定的文本值。我拼凑了一个简单的xml文件,每个ActionItem测试失败,因此应该删除它。取而代之的是,4个人中只有2个被移除。在
我的猜测是,当第一个从列表中删除时,地址会发生变化,从而跳过第二个地址。下一步,删除第三个,列表再次向前移动。在
既然在这个简单的例子中,所有4个元素都应该被删除,那么构建代码的更好方法是什么?如果可以的话,我更喜欢使用同一个库,因为我已经在它上面投入了很多时间,而且还没有探索lxml或其他库。在
注意,我一直在使用不同的方法来确定根对象(myroot)的范围。我把它作为一个参数,一个返回值,这里作为一个全局变量。我每种方法都有相同的结果。在
代码.py:
注意事项:
XML_STR
:示例xml(也可以放在单独的文件中)NULL
,为空,或者只是由不可打印的字符组成)REMOVE_GRANDCHILD_TAGS
-标记名的列表,以便如果(根子节点)节点的子节点与列表中的所有标记匹配,则可以将其删除-替换sTag
和{is_node_subject_to_delete
注释),如果需要另一个标记(例如GrandChildNode_ToErase
),则可以将其删除,只需将其添加到列表中即可(无需其他复制/粘贴操作)REMOVE_GRANDCHILD_TEXT
-前一项的2nd条件:如果节点文本名称包含该文本(“Child”)-如果两个条件都满足,则节点可以删除is_node_subject_to_delete(node)
-检查是否可以删除参数(node
-根子级):for
(最外层)循环main
-一个通用包装函数输出:
相关问题 更多 >
编程相关推荐