Python 使用lxml删除整个节点
我有一个xml文档,如下所示: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 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>