python - 使用lxml删除整个节点

标签 python xml lxml

我有一个如下所示的 xml 文档:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>company</groupId>
    <artifactId>art-id</artifactId>
    <version>RELEASE</version>
</parent>

<properties>
    <tomcat.username>admin</tomcat.username>
    <tomcat.password>admin</tomcat.password>
</properties>

<dependencies>
    <dependency>
        <groupId>asdf</groupId>
        <artifactId>asdf</artifactId>
        <version>[3.8,)</version>
    </dependency>
    <dependency>
        <groupId>asdf</groupId>
        <artifactId>asdf</artifactId>
        <version>[4.1,)</version>
    </dependency>
</dependencies>

如何删除整个节点的“依赖项”?

我查看了 stackoverflow 上的其他问题和答案,不同之处在于此 xml 的命名空间方面,其他问题要求删除“依赖项”等子元素,而我想删除整个节点“依赖项”。 ”有没有一种简单的方法使用lxml删除整个节点?

以下给出“NoneType”对象没有属性“删除”错误:

from lxml import etree as ET

tree = ET.parse('pom.xml')
namespace = '{http://maven.apache.org/POM/4.0.0}'
root = ET.Element(namespace+'project')
root.find(namespace+'dependencies').remove()

最佳答案

您可以为您的命名空间创建一个字典映射,找到节点,然后调用root.remove传递该节点,您不调用 .remove 在节点上:

x = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>company</groupId>
    <artifactId>art-id</artifactId>
    <version>RELEASE</version>
</parent>    
<properties>
    <tomcat.username>admin</tomcat.username>
    <tomcat.password>admin</tomcat.password>
</properties>    
<dependencies>
    <dependency>
        <groupId>asdf</groupId>
        <artifactId>asdf</artifactId>
        <version>[3.8,)</version>
    </dependency>
    <dependency>
        <groupId>asdf</groupId>
        <artifactId>asdf</artifactId>
        <version>[4.1,)</version>
    </dependency>
</dependencies>
</project>"""
import lxml.etree as et
from StringIO import StringIO

tree = et.parse(StringIO(x))
root =tree.getroot()

nsmap = {"mav":"http://maven.apache.org/POM/4.0.0"}

root.remove(root.find("mav:dependencies", namespaces=nsmap))

print(et.tostring(tree))

这会给你:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>company</groupId>
    <artifactId>art-id</artifactId>
    <version>RELEASE</version>
</parent>    
<properties>
    <tomcat.username>admin</tomcat.username>
    <tomcat.password>admin</tomcat.password>
</properties>   
</project>

关于python - 使用lxml删除整个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39922132/

相关文章:

xml - XQuery嵌套返回花

python - 在PyCharm中启用 undefined variable 的警告

python - 在来自不同线程的回调中设置 asyncio.Future 的值

java - JAXB XML输出格式问题

python + libxml2 : Sorting XML node's elements according to attribute's value

python - 如何从源代码中没有显示标签的网站中抓取内容?

python - 将蜘蛛结果保存到数据库

python - 如何将数据框转换为工作表(Python 3.8)?

python - 如何使用 anaconda 安装 import_ipynb 包?

php - 如何在 curl 中发送 SOAP 请求