Python 使用lxml删除整个节点

Python 使用lxml删除整个节点,python,xml,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:/

我有一个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>

首先,获取根节点。由于它是
(vs
),因此
依赖项的“父”元素是
项目
。文档中的示例:

import xml.etree.ElementTree as ET  
tree = ET.parse('country_data.xml')  
root = tree.getroot() 
拥有根目录后,请选中
root.tag()
,它应该是“project”

然后执行
root.remove(root.find('dependencies'))
,其中
root
project
节点


如果它是
,那么它将是无效的XML,因为必须有根元素。但是,我可以准确地看到您来自何处。

您可以为您的命名空间创建dict映射,找到节点,然后调用root。删除通过节点,则不调用。在节点上删除:

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))
x=”“”
4.0.0
公司
艺术id
释放
管理
管理
asdf
asdf
[3.8,)
asdf
asdf
[4.1,)
"""
将lxml.etree作为et导入
从StringIO导入StringIO
tree=et.parse(StringIO(x))
root=tree.getroot()
nsmap={“mav”:http://maven.apache.org/POM/4.0.0"}
remove(root.find(“mav:dependencies”,namespace=nsmap))
打印(et.tostring(树))
这将给你:

<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>

4.0.0
公司
艺术id
释放
管理
管理

root是否类似于root=ET.Element(“项目”)?我刚刚编辑了我的答案,请参阅更新。如果您是从头开始创建树,那么您可以这样定义一个元素,但由于您是从文件中读取,因此需要使用
getroot()
。我更新了我的代码以反映您的更改,但我收到一个错误,指出删除需要两个参数。您知道我哪里出错了吗?谢谢您的帮助。谢谢!这就是我要找的。当我打印文本时,结束项目标记缩进了,这是问题吗?@d.griner,不用担心。如果您愿意,这不会有什么不同要写入文件,只需使用
tree.write(“out.xml”,encoding=“utf-8”,xml\u declaration=True)
与最终解决方案无关,但StringIO独立模块是否已从中删除?不应从io导入行:
导入StringIO
?@Parfait。是的,但如果您使用io,您将在不使用unicode的情况下看到它的错误,并且声明也会导致lxml错误,仅使用StringIO更容易。明白了,但我收到了一封电子邮件错误
ImportError:没有名为“StringIO”的模块。
。我们应该建议未来的读者只需从文件中解析xml即可。
<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>