使用ElementTree解析XML时使用名称空间

nick01

这是关于使用ElementTree修改XML的问题

我现在在我的XML中有名称空间,并尝试通过'ElementTree'了解在Python中使用名称空间解析XML的答案,并具有以下内容。

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">
 <grandParent>
  <parent>
   <child>Sam/Astronaut</child>
  </parent>
 </grandParent>
</project>

查看通过“ ElementTree”在Python中使用名称空间解析XML之后的python代码

import xml.etree.ElementTree as ET

spaces='xmlns':'http://maven.apache.org/POM/4.0.0','schemaLocation':'http://maven.apache.org/xsd/maven-4.0.0.xsd'}

tree = ET.parse("test.xml")
a=tree.find('parent')          
for b in a.findall('child', namespaces=spaces):
 if b.text.strip()=='Jay/Doctor':
    print "child exists"
    break
else:
    ET.SubElement(a,'child').text="Jay/Doctor"

tree.write("test.xml")

我收到错误:AttributeError:'NoneType'对象没有属性'findall'

罗伯

这条线上有两个问题:

a=tree.find('parent')          

首先,<parent>不是root元素的直接子代。<parent>是根元素的孙代。父母的道路看起来像/project/grandparent/parent要搜索<parent>,尝试XPath表达式*/parent或possiblly //parent

其次,它<parent>存在于默认名称空间中,因此.find()仅凭其简单名称就无法使用它。您需要添加名称空间。

这是对的两个同样有效的调用tree.find(),每个调用都应找到该<parent>节点:

a=tree.find('*/{http://maven.apache.org/POM/4.0.0}parent')
a=tree.find('*/xmlns:parent', namespaces=spaces)

接下来,对的调用findall()需要一个名称空间限定符:

for b in a.findall('xmlns:child', namespaces=spaces) 

第四,创建新的子元素的调用需要一个名称空间限定符。可能有一种使用快捷方式名称的方法,但是我找不到它。我必须使用长名称形式。

ET.SubElement(a,'{http://maven.apache.org/POM/4.0.0}child').text="Jay/Doctor"

最后,除非提供默认的名称空间,否则XML输出看起来很难看:

tree.write('test.xml', default_namespace=spaces['xmlns'])

与XML方面无关,您错误地复制了上一个问题的答案。else与排队for,不符合if

for ...
  if ...
else ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用名称空间解析XML

来自分类Dev

在Python中使用ElementTree解析具有名称空间的XML

来自分类Dev

使用ElementTree解析XML

来自分类Dev

使用空名称空间解析xml

来自分类Dev

如何使用名称空间解析XML

来自分类Dev

使用名称空间信息解析XML

来自分类Dev

使用DOM解析XML与名称空间

来自分类Dev

如何使用名称空间解析XML?

来自分类Dev

使用名称空间解析xml的问题

来自分类Dev

使用XML名称空间时简化语法

来自分类Dev

使用elementtree解析xml网站

来自分类Dev

使用Python ElementTree解析XML

来自分类Dev

使用elementtree解析xml站点

来自分类Dev

使用lxml解析xml时,在标签中保留名称空间前缀

来自分类Dev

使用SimpleXMLparser PHP使用名称空间解析xml

来自分类Dev

使用PHP和SimpleXML使用名称空间解析APFeeds XML

来自分类Dev

使用元素树findall解析XML名称空间

来自分类Dev

在PLSQL中使用名称空间解析嵌套的XML

来自分类Dev

使用带有lxml的嵌套名称空间解析XML属性

来自分类Dev

使用XSD验证XML文件时如何使用名称空间

来自分类Dev

使用ElementTree的递归XML解析python

来自分类Dev

使用ElementTree顺序解析某些XML标签

来自分类Dev

使用XPath选择XML节点时如何忽略名称空间

来自分类Dev

使用XML文档时指定名称空间

来自分类Dev

使用FOR XML EXPLICIT时删除xmlns =“”名称空间声明

来自分类Dev

使用XML文档时指定名称空间

来自分类Dev

使用XSLT复制时删除XML名称空间

来自分类Dev

使用ElementTree进行Python XML解析:如何查找具有相同名称的元素的值?

来自分类Dev

使用xml.etree.ElementTree解析XML时获取空列表作为属性