首页 > 编程问答 >lxml.etree 元素在副本上删除命名空间

lxml.etree 元素在副本上删除命名空间

时间:2024-07-28 12:02:01浏览次数:8  
标签:python xml lxml elementtree

我正在使用 lxml.etree 库将 XML 文件拼接在一起,并且命名空间在写入时被删除。

Input.xml

<?xml version="1.0" encoding="UTF-8"?>
<haul>
    <uuid>abc</uuid>
    <port xmlns="hello"
          xmlns:a="hello">
        <v>
            <a:value>0</a:value>
            <type>int</type>
        </v>
    </port>
</haul>

我尝试了此代码:

test.py

tree = load_tree_from_file('Input.xml')
port = tree.find('{hello}port')
v = port.find('{hello}v')
v2=copy.deepcopy(v)
port.append(v2)

d = os.path.dirname(__file__)
tree.write(os.path.join(d, 'Output.xml'))

我得到了此输出:

Output.xml

<haul>
    <uuid>abc</uuid>
    <port xmlns="hello" xmlns:a="hello">
        <v>
            <a:value>0</a:value>
            <type>int</type>
        </v>
        <v>
            <value>0</value>
            <type>int</type>
        </v>
    </port>
</haul>

我期望并且需要|| |元素像第一个一样。 <value> Element to be <a:value> like the first one.


问题在于 copy.deepcopy() lxml.etree 元素上无法完全保留命名空间信息。虽然它复制了元素和属性,但是命名空间的关联方式在复制过程中会丢失。

解决方案是使用 lxml.etree 自带的复制机制,它正确地处理命名空间:

import os
from lxml import etree

def load_tree_from_file(filename):
  with open(filename, 'r') as f:
    return etree.parse(f)

tree = load_tree_from_file('Input.xml')
port = tree.find('{hello}port')
v = port.find('{hello}v')

# 使用 etree.ElementTree.copy() 进行复制
v2 = etree.ElementTree.copy(v) 

port.append(v2)

d = os.path.dirname(__file__)
tree.write(os.path.join(d, 'Output.xml'), pretty_print=True)

这段代码使用 etree.ElementTree.copy(v) 来创建 v 元素的副本。 etree.ElementTree.copy() 函数会正确地复制元素及其所有子元素,包括命名空间信息。这样,输出文件中的第二个 <v> 元素就会保留原始的命名空间前缀:

<haul>
  <uuid>abc</uuid>
  <port xmlns="hello" xmlns:a="hello">
    <v>
      <a:value>0</a:value>
      <type>int</type>
    </v>
    <v>
      <a:value>0</a:value>
      <type>int</type>
    </v>
  </port>
</haul>

总结:

  • 不要使用 copy.deepcopy() 复制 lxml.etree 元素。
  • 使用 etree.ElementTree.copy() 来确保正确复制命名空间信息。

标签:python,xml,lxml,elementtree
From: 78802913

相关文章

  • 【Python】字母 Rangoli 图案
    一、题目YouaregivenanintegerN.YourtaskistoprintanalphabetrangoliofsizeN.(RangoliisaformofIndianfolkartbasedoncreationofpatterns.)Differentsizesofalphabetrangoliareshownbelow:#size3----c------c-b-c--c-b-a-b-c--c......
  • python 闭包、装饰器
    一、闭包:1.外部函数嵌套内部函数 2.外部函数返回内部函数 3.内部函数可以访问外部函数局部变量         闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用......
  • 掌握 IPython %%time 魔法命令:高效测量代码块执行时间
    引言在编程和数据分析中,了解代码的执行时间是优化性能的关键步骤。IPython,作为一个强大的交互式计算环境,提供了多种工具来帮助用户测量和优化代码。其中,%%time魔法命令是IPython中用来测量代码块执行时间的便捷工具。本文将详细介绍%%time魔法命令的使用方法,并通过一......
  • 探索 IPython 中的 %%javascript 魔法命令:运行 JavaScript 代码的秘籍
    引言IPython是一个强大的交互式计算环境,它不仅支持Python语言,还通过各种魔法命令扩展了其功能。其中,%%javascript魔法命令是IPython扩展中一个非常有趣的特性,它允许用户在IPython环境中直接运行JavaScript代码。这对于需要在数据科学和科学计算中使用JavaScript......
  • pythonasm库分析,看看你和自学编程小学生的差距
    下面是pythonasm.asm库的源代码fromkeystoneimport*fromcapstoneimport*assembly_instructions=[]#储存汇编指令的列表#汇编指令写入列表defmov(reg1,reg2):assembly_instructions.append(f"mov{reg1},{reg2}")defdb(value):assembly_instructio......
  • 【Python系列】Python 中的垃圾收集:深入理解与实践
    ......
  • Python酷库之旅-第三方库Pandas(050)
    目录一、用法精讲181、pandas.Series.var方法181-1、语法181-2、参数181-3、功能181-4、返回值181-5、说明181-6、用法181-6-1、数据准备181-6-2、代码示例181-6-3、结果输出182、pandas.Series.kurtosis方法182-1、语法182-2、参数182-3、功能182-4、返回值1......
  • 使用 python matplotlib 和 metpy 添加辅助 y 轴
    我知道这个问题似乎与这里的许多其他问题类似,但我已经尝试过它们,不幸的是它们都没有解决我在尝试添加辅助y轴时当前面临的问题。问题是很简单,但我找不到任何可以修复它的东西:在SkewT图上添加辅助y轴会更改图的y限制,而不仅仅是添加轴。基本上,我希望添加辅......
  • Python实现基于卷积神经网络的恶意代码分类系统(设计思路概述)
    这个设计是关于一个基于卷积神经网络(CNN)的恶意代码分类系统,其主要目标是对恶意代码进行自动分类,帮助用户识别并防范不同类型的恶意软件。以下是该系统的设计思路、方法及实现过程的详细解释:设计思路恶意代码图像化:由于直接对恶意代码的源代码或二进制形式进行分类难度较......
  • Python实现基于卷积神经网络的恶意代码分类系统
    目录摘要IABSTRACTII1绪论11.1研究背景与意义11.2国内外研究现状21.3技术路线32相关知识背景52.1恶意代码检测概述52.2深度学习技术基础62.2.1卷积神经网络基本结构72.2.2激活72.2.3池化83基于卷积神经网络的恶意代码分类方法103.1卷......