python - 如何使用 Python 从 XML 中删除元素

标签 python xml

我被 XML 和 Python 困住了。这个任务很简单,但到目前为止我无法解决它并且花了那么长时间。我来这里是为了寻求如何用几行代码解决它的建议。

感谢您对遍历树的任何帮助。我总是以太多或太少的元素结束。元素可以无限嵌套。给出的例子只是一个例子。我会接受任何解决方案,不挑剔 dom、minidom、sax 等等..

我有一个类似于这个的 XML 文件:

<root>
    <elm>
        <elm>Common content</elm>

        <elm xmlns="http://example.org/ns">
            <elm lang="en">Content EN</elm>
            <elm lang="cs">žluťoučký koníček</elm>
        </elm>

        <elm xml:id="abc123">Common content</elm>

        <elm lang="en">Content EN</elm>
        <elm lang="cs">Content CS</elm>

        <elm lang="en">
            <elm>Content EN</elm>
            <elm>Content EN</elm>
        </elm>

        <elm lang="cs">
            <elm>Content CS</elm>
            <elm>Content CS</elm>
        </elm>
    </elm>
</root>

我需要什么 - 解析 XML 并编写一个新文件。新文件应包含给定语言的所有元素和不带 lang 属性的元素。

对于“cs”语言,输出文件应该包含:

<root>
    <elm>
        <elm>Common content</elm>

        <elm xmlns="http://example.org/ns">
            <elm lang="cs">žluťoučký koníček</elm>
        </elm>

        <elm xml:id="abc123">Common content</elm>

        <elm lang="cs">Content CS</elm>

        <elm lang="cs">
            <elm>Content CS</elm>
            <elm>Content CS</elm>
        </elm>
    </elm>
</root>

如果您可以在新文件中省略 lang 属性,那就更好了。但这并不重要。

UPDATE1:添加了 unicode 字符和命名空间属性。

更新 2:使用 Python 2.5,首选标准库。

最佳答案

使用 lxml :

import lxml.etree as le

with open('doc.xml','r') as f:
    doc=le.parse(f)
    for elem in doc.xpath('//*[attribute::lang]'):
        if elem.attrib['lang']=='en':
            elem.attrib.pop('lang')
        else:
            parent=elem.getparent()
            parent.remove(elem)
    print(le.tostring(doc))

产量

<root>
    <elm>Common content</elm>

    <elm>
        <elm>Content EN</elm>
        </elm>

    <elm>Common content</elm>

    <elm>Content EN</elm>
    <elm>
        <elm>Content EN</elm>
        <elm>Content EN</elm>
    </elm>

    </root>

关于python - 如何使用 Python 从 XML 中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3593204/

相关文章:

python - 我想将base64转换为json

c# - C#检查xml节点的安全方法?

php - 抓取 HTML 表数据并创建 XML 文档

python - 如何将图像添加到小部件?为什么不显示图像?

python - Django:作为值列表查询一部分的相关模型值列表

python - 在故意失败的回调中将任务标记为成功

c# - 将具有多个元素的 XML 反序列化为单个 C# 对象

java - Android usb主机与定制板的串行通信

android - 如何在 ScrollView 中滚动 RecyclerView

python - 将 Python pandas 数据帧行切片写入文件