【问题标题】:removing elements using python and lxml使用 python 和 lxml 删除元素
【发布时间】:2025-12-04 08:30:01
【问题描述】:

我需要从这个 xml 中删除以下内容 -

<entry>
    <id>1234</id>
    <title>hello</title>
    <source>com.server.webclient.xxx</source>
    <xxx:component>
        <xxx:id>2134</xxx:id>
        <xxx:name>name</xxx.name>
    </xxx:component>
</entry>

我想要做的是删除&lt;entry&gt;&lt;id&gt;&lt;title&gt;&lt;source&gt;

我的代码现在只是尝试删除 ID,但没有返回错误,但没有删除值。

with open('c:\\temp\\%s.xml' % args.componentName, 'w') as f:
    xmlObject = etree.fromstring(r.content)
    for elem in xmlObject.xpath( '//id' ) :
        elem.remove(elem)
    f.write(etree.tostring(xmlObject, pretty_print=True))

这就是我希望我的 XML 看起来的样子 -

<xxx:component>
    <xxx:id>2134</xxx:id>
    <xxx:name>name</xxx.name>
</xxx:component>

【问题讨论】:

  • 如果你没有收到任何错误,那么这意味着 xmlObject.xpath('//id') 没有返回任何结果,因为如果你每次都尝试做 - elem.remove(elem) ,你会遇到问题 - ValueError: Element is not a child of this node.跨度>
  • 鉴于此,从 xml 中获取 &lt;xxx:component&gt; 元素并将其单独写入另一个 xml 文件不是更容易吗?
  • 关于您的第二点更有可能是更好的解决方案?我会看看我的 googlefu 会出现什么选项。

标签: python lxml


【解决方案1】:

实现您想要的更简单的选择是在&lt;entry&gt; 组件中找到&lt;xxx:component&gt; 元素并将其写入文件。

例子-

with open('c:\\temp\\%s.xml' % args.componentName, 'w') as f:
    xmlObject = etree.fromstring(r.content)
    reqElem = xmlObject.xpath('//xxx:component',namespaces=ns)   #ns should have the `xxx` prefix and whatever its actual namespace is
    if len(reqElem) == 1:
        f.write(etree.tostring(reqElem[0], pretty_print=True))

【讨论】:

  • 谢谢!更新标签以使其有效。我现在只是在弄清楚名称空间问题。命名空间是这个&lt;tes:Variable xmlns:tes="http://www.tidalsoftware.com/client/tesservlet"&gt;
  • 那么 ns 应该是一个字典,比如 - ns = {'tes':'http://www.tidalsoftware.com/client/tesservlet'}
  • 好吧,我说得对 :) 问题是它返回了一个 0kb 的文件
  • 也许尝试在我提供的代码中添加一个 else 部分,如果它进入 else 则打印,然后检查它为什么会出现在那里?
  • 输入一个 else 来打印 reqElem 并得到空 []