我正在编写一个PythonXML(NETCONF)解析器,目标是从服务器获取一个RPC回复XML,修改一些项,并生成一个最小的配置.xml,然后可以将其发送到服务器.

在修改图形用户界面中的值时,我将modified elements添加到一个集合中,以及它们的ancestor elementssibling elements(不包含子对象),因为这将是"最小可行"结果文件的内容

我正在处理的示例(缩写)XML:

<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:a1cfef75-dba4-4fdf-81eb-8d5f65d35511">
  <data>
    <bridges xmlns="urn:ieee:std:802.1Q:yang:ieee802-dot1q-bridge">
      <bridge>
        (...)
      </bridge>
    </bridges>
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
      <interface>
        <name>PORT_0</name>
        <description>random</description>
        <type xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type">ianaift:ethernetCsmacd</type>
        <bridge-port xmlns="urn:ieee:std:802.1Q:yang:ieee802-dot1q-bridge">
            (...)
        </bridge-port>
      </interface>
      <interface>
        (...)
      </interface>
    </interfaces>
    <keystore xmlns="urn:ietf:params:xml:ns:yang:ietf-keystore">
        (...)
    </keystore>
  </data>
</rpc-reply>

我在同时使用.iter().remove()时发现了一个问题,例如,当我想要修改&lt;Description&gt;时,它只删除&lt;Bridge&gt;分支,然后.iter()循环不会返回到&lt;接口&gt;,或返回到它的直接祖先,这很可能是因为我已经删除了关于祖先的所有信息.换句话说,.iter().循环在第一次遇到"最后一叶"元素时停止.

我正在使用以下代码来删除项目,self.itemstokeep是一组etree.Element以保留

for item in treecopy.iter():
    if not item in self.itemstokeep:
        if not item.getparent() == None:
            item.getparent().remove(item)
    else:
        continue

Can you recommend any nice way to solve this or completely work around the problem?
The biggest difference from the answers I've found here so far is that I won't know which items to remove, only which ones to keep, and I won't always have the same input structure with exception of 2 top-level elements, which makes the usual 'xpath' approach complicated...

我也想过不再创建一个itemstokeep的集合,而是在元素被修改时基本上重建一棵树,但如果这看起来像是一个非优化的解决方案,因为我需要总是判断祖先之间的重复项并多次遍历树-但可能我也遗漏了一些东西.

推荐答案

张贴的答案不起作用.如果将来任何人有类似的问题,我已经通过使用2个循环解决了这个问题:

  1. 第一个循环创建一个项目集,即我想要移除的项目集,它首先被定义为空deleteset = set()

  2. 第二个循环循环遍历创建的集合并删除先前定义的元素

        for item in treecopy.iter():
           if not item in self.copyitems_to_keep:                 
              if not item.getparent() == None:                     
                 deleteset.add(item)
              else:                     
                 continue
    
        for item in deleteset:
           item.getparent().remove(item)
    

多亏了Hermann12对原始问题的注释,我也意识到我在代码的另一部分中犯了错误--最初我没有使用deepcopy()来创建treecopy根元素,这导致了应用程序中的另一类问题.

如果将来有人偶然发现了这条线索,我仍然很想知道,一旦删除了包含子元素的元素,是否有办法强制.iter()不再进入不再存在的 twig .

Python相关问答推荐

为什么Pydantic在我申报邮箱时说邮箱丢失

用ctype构建指针链

双情节在单个图上切换-pPython

try 使用tensorFlow.keras.models时optree Import错误

自动编码器和极坐标

无法导入已安装的模块

如何在Python中使用时区夏令时获取任何给定本地时间的纪元值?

将HLS纳入媒体包

使用SciPy进行曲线匹配未能给出正确的匹配

如何将双框框列中的成对变成两个新列

在Pandas DataFrame操作中用链接替换'方法的更有效方法

大小为M的第N位_计数(或人口计数)的公式

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

ThreadPoolExecutor和单个线程的超时

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

mypy无法推断类型参数.List和Iterable的区别

从嵌套的yaml创建一个嵌套字符串,后面跟着点

如何在TensorFlow中分类多个类

基于行条件计算(pandas)

Geopandas未返回正确的缓冲区(单位:米)