如果您对使用PythonElementTree创建不带ns0命名空间的SVG/XML文档感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于使用PythonElementTree
如果您对使用Python ElementTree创建不带ns0命名空间的SVG / XML文档感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于使用Python ElementTree创建不带ns0命名空间的SVG / XML文档的详细内容,我们还将为您解答python elementtree生成xml的相关问题,并且为您提供关于Python ElementTree 将两个 XML 文件与第一个命名空间合并、python xml.etree.ElementTree遍历xml所有节点实例详解、python XML文件解析:用ElementTree解析XML、python xml解析之 xml.etree.ElementTree的有价值信息。
本文目录一览:- 使用Python ElementTree创建不带ns0命名空间的SVG / XML文档(python elementtree生成xml)
- Python ElementTree 将两个 XML 文件与第一个命名空间合并
- python xml.etree.ElementTree遍历xml所有节点实例详解
- python XML文件解析:用ElementTree解析XML
- python xml解析之 xml.etree.ElementTree
使用Python ElementTree创建不带ns0命名空间的SVG / XML文档(python elementtree生成xml)
我正在Python 2.7中使用ElementTree构建SVG文档。这是代码:
from xml.etree import ElementTree as etreeroot = etree.XML(''<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg"></svg>'')root.append(etree.Element("path"))root[0].set("d", "M1 1 L2 2 Z")print etree.tostring(root, encoding=''iso-8859-1'')
生成输出:
<?xml version=''1.0'' encoding=''iso-8859-1''?><ns0:svg xmlns:ns0="http://www.w3.org/2000/svg" height="100%" version="1.1" width="100%"><path d="M1 1 L2 2 Z" /></ns0:svg>
这不会解析为有效的SVG。如何删除ns0名称空间?
答案1
小编典典我只是想通了,无法删除问题,所以这里是:
etree.register_namespace("","http://www.w3.org/2000/svg")
我认为这仅适用于Python 2.7。
Python ElementTree 将两个 XML 文件与第一个命名空间合并
如何解决Python ElementTree 将两个 XML 文件与第一个命名空间合并?
请耐心等待,我正在尝试使用它的命名空间和根来解析我的“default_values.xml”。之后我想用另一个名为“test_values.xml”的xml文件的根扩展“defaul_values.xml”的根,也将组合的xml写入“final_values.xml”文件。
到目前为止,我进行了扩展(或合并)过程,但我在“final.xml”文件中的命名空间上遇到了问题。我的 Python 代码没有按照我的意愿编写命名空间。这是 xml 文件和代码,也是我想在最后一步创建的 xml 文件:
“default_values.xml”
<?xml version="1.0" encoding="UTF-8"?>
<myMainRoot xmlns:ns1="http://www.examplenamespace1.com/v123#"
xmlns:ns2="http://www.examplenamespace2.com/v123#"
xmlns:ns3="http://www.examplenamespace3.com/v123#"
xmlns="http://www.examplenamespace4.com"
xmlns:xsi="http://www.examplenamespace4.com/v123">
<title>
<version>1.0</version>
<realMadrid>
<Ronaldo>Portugal</Ronaldo>
</realMadrid>
<barcelona>
<Messi>Argentina</Messi>
</barcelona>
<teamNo>12-13-14</teamNo>
<gameDate>2017-04-23</gameDate>
<ns2:abc>
<ns2:abc1>
<ns2:abc2 Algorithm="http://www.examplenamespace5.com/">
</ns2:abc2>
<ns2:abc3 Algorithm="http://www.examplenamespace5.com/">
</ns2:abc3>
<ns2:abc4>
<ns2:abc5 Algorithm="http://www.examplenamespace5.com/">
</ns2:abc5>
<ns2:abc6>ZGVmYXVsdA==</ns2:abc6>
</ns2:abc4>
</ns2:abc1>
</ns2:abc>
</title>
</myMainRoot>
“test_values.xml”
<myChildRoot>
<jerseyNo>7</jerseyNo>
<transferTime>11.09.2009</transferTime>
<scoreNo>
<year1>23</year1>
<year2>22</year2>
<year3>21.0</year3>
</scoreNo>
<scoreNo>
<year1>43</year1>
<year2>42</year2>
<year3>41.0</year3>
</scoreNo>
<finalNo>2</finalNo>
</myChildRoot>
“final_values.xml”
<?xml version=''1.0'' encoding=''UTF-8''?>
<ns0:myMainRoot xmlns:ns0="http://www.examplenamespace4.com" xmlns:ns1="http://www.examplenamespace2.com/v123#">
<ns0:title>
<ns0:version>1.0</ns0:version>
<ns0:realMadrid>
<ns0:Ronaldo>Portugal</ns0:Ronaldo>
</ns0:realMadrid>
<ns0:barcelona>
<ns0:Messi>Argentina</ns0:Messi>
</ns0:barcelona>
<ns0:teamNo>12-13-14</ns0:teamNo>
<ns0:gameDate>2017-04-23</ns0:gameDate>
<ns1:abc>
<ns1:abc1>
<ns1:abc2 Algorithm="http://www.examplenamespace5.com/">
</ns1:abc2>
<ns1:abc3 Algorithm="http://www.examplenamespace5.com/">
</ns1:abc3>
<ns1:abc4>
<ns1:abc5 Algorithm="http://www.examplenamespace5.com/">
</ns1:abc5>
<ns1:abc6>ZGVmYXVsdA==</ns1:abc6>
</ns1:abc4>
</ns1:abc1>
</ns1:abc>
</ns0:title>
<extended>
<jerseyNo>7</jerseyNo>
<transferTime>11.09.2009</transferTime>
<scoreNo>
<year1>23</year1>
<year2>22</year2>
<year3>21.0</year3>
</scoreNo>
<scoreNo>
<year1>43</year1>
<year2>42</year2>
<year3>41.0</year3>
</scoreNo>
<finalNo>2</finalNo>
</extended>
</ns0:myMainRoot>
还有我的 Python 代码:
import xml.etree.ElementTree as ET
tree_of_default_values_xml = ET.parse(''1.xml'')
root_of_default_values_xml = tree_of_default_values_xml.getroot()
tree_of_data_block_xml = ET.parse("2.xml")
root_of_data_block_xml = tree_of_data_block_xml.getroot()
subelement_to_extend_for_parent_xml_root = ET.SubElement(root_of_default_values_xml,"extended")
subelement_to_extend_for_parent_xml_root.extend(root_of_data_block_xml)
tree_of_default_values_xml.write("3.xml",encoding="UTF-8",xml_declaration=True)
最后,这是我想要为“final.xml”做的结果:
<?xml version="1.0" encoding="UTF-8"?>
<myMainRoot xmlns:ns1="http://www.examplenamespace1.com/v123#"
xmlns:ns2="http://www.examplenamespace2.com/v123#"
xmlns:ns3="http://www.examplenamespace3.com/v123#"
xmlns="http://www.examplenamespace4.com"
xmlns:xsi="http://www.examplenamespace4.com/v123">
<title>
<version>1.0</version>
<realMadrid>
<Ronaldo>Portugal</Ronaldo>
</realMadrid>
<barcelona>
<Messi>Argentina</Messi>
</barcelona>
<teamNo>12-13-14</teamNo>
<gameDate>2017-04-23</gameDate>
<ns2:abc>
<ns2:abc1>
<ns2:abc2 Algorithm="http://www.examplenamespace5.com/">
</ns2:abc2>
<ns2:abc3 Algorithm="http://www.examplenamespace5.com/">
</ns2:abc3>
<ns2:abc4>
<ns2:abc5 Algorithm="http://www.examplenamespace5.com/">
</ns2:abc5>
<ns2:abc6>ZGVmYXVsdA==</ns2:abc6>
</ns2:abc4>
</ns2:abc1>
</ns2:abc>
</title>
<extended>
<jerseyNo>7</jerseyNo>
<transferTime>11.09.2009</transferTime>
<scoreNo>
<year1>23</year1>
<year2>22</year2>
<year3>21.0</year3>
</scoreNo>
<scoreNo>
<year1>43</year1>
<year2>42</year2>
<year3>41.0</year3>
</scoreNo>
<finalNo>2</finalNo>
</extended>
</myMainRoot>
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
python xml.etree.ElementTree遍历xml所有节点实例详解
python xml.etree.ElementTree遍历xml所有节点
XML文件内容:
<students> <student name='刘备' sex='男' age='35'/> <student name='吕布' sex='男' age='38'/> <student name='貂蝉' sex='女' age='22'/> </students>
代码:
#-*- coding: UTF-8 -*- # 从文件中读取数据 import xml.etree.ElementTree as ET #全局唯一标识 unique_id = 1 #遍历所有的节点 def walkData(root_node,level,result_list): global unique_id temp_list =[unique_id,root_node.tag,root_node.attrib] result_list.append(temp_list) unique_id += 1 #遍历每个子节点 children_node = root_node.getchildren() if len(children_node) == 0: return for child in children_node: walkData(child,level + 1,result_list) return #获得原始数据 #out: #[ # #ID,Level,Attr Map # [1,1,{'ID':1,'Name':'test1'}],# [2,'Name':'test2'}],#] def getXmlData(file_name): level = 1 #节点的深度从1开始 result_list = [] root = ET.parse(file_name).getroot() walkData(root,result_list) return result_list if __name__ == '__main__': file_name = 'test.xml' R = getXmlData(file_name) for x in R: print x pass
输出结果:
[1,'students',{}] [2,2,'student',{'age': '35','name': u'\u5218\u5907','sex': u'\u7537'}] [3,{'age': '38','name': u'\u5415\u5e03','sex': u'\u7537'}] [4,{'age': '22','name': u'\u8c82\u8749','sex': u'\u5973'}]
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
python XML文件解析:用ElementTree解析XML
Python标准库中,提供了ET的两种实现。一个是纯Python实现的xml.etree.ElementTree,另一个是速度更快的C语言实现xml.etree.cElementTree。请记住始终使用C语言实现,因为它的速度要快很多,而且内存消耗也要少很多。如果你所使用的Python版本中没有cElementTree所需的加速模块,你可以这样导入模块
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
xml file
<?xml version="1.0"?>
<doc>
<branch name="codingpy.com" hash="1cdf045c">
text,source
</branch>
<branch name="release01" hash="f200013e">
<sub-branch name="subrelease01">
xml,sgml
</sub-branch>
</branch>
<branch name="invalid">
</branch>
</doc>
1、将XML文档解析为树(tree)
加载这个文档,并进行解析
>>> import xml.etree.ElementTree as ET
>>> tree = ET.ElementTree(file=''doc1.xml'')
获取根元素(root element):
>>> tree.getroot()
<Element ''doc'' at 0x11eb780>
根元素(root)是一个Element对象,看根元素都有哪些属性:
>>> root = tree.getroot()
>>> root.tag, root.attrib
(''doc'', {})
根元素并没有属性。与其他Element对象一样,根元素也具备遍历其直接子元素的接口:
>>> for child_of_root in root:
... print child_of_root.tag, child_of_root.attrib
...
branch {''hash'': ''1cdf045c'', ''name'': ''codingpy.com''}
branch {''hash'': ''f200013e'', ''name'': ''release01''}
branch {''name'': ''invalid''}
还可以通过索引值来访问特定的子元素:
>>> root[0].tag, root[0].text
(''branch'', ''\n text,source\n '')
2、查找需要的元素
Element对象有一个iter方法,可以对某个元素对象之下所有的子元素进行深度优先遍历(DFS)。ElementTree对象同样也有这个方法。下面是查找XML文档中所有元素的最简单方法:
>>> for elem in tree.iter():
... print elem.tag, elem.attrib
...
doc {}
branch {''hash'': ''1cdf045c'', ''name'': ''codingpy.com''}
branch {''hash'': ''f200013e'', ''name'': ''release01''}
sub-branch {''name'': ''subrelease01''}
branch {''name'': ''invalid''}
可以对树进行任意遍历——遍历所有元素,查找出自己感兴趣的属性。但是ET可以让这个工作更加简便、快捷。iter方法可以接受tag名称,然后遍历所有具备所提供tag的元素:
>>> for elem in tree.iter(tag=''branch''):
... print elem.tag, elem.attrib
...
branch {''hash'': ''1cdf045c'', ''name'': ''codingpy.com''}
branch {''hash'': ''f200013e'', ''name'': ''release01''}
branch {''name'': ''invalid''}
3、支持通过XPath查找元素
使用XPath查找感兴趣的元素,更加方便。Element对象中有一些find方法可以接受Xpath路径作为参数,find方法会返回第一个匹配的子元素,findall以列表的形式返回所有匹配的子元素, iterfind则返回一个所有匹配元素的迭代器(iterator)。ElementTree对象也具备这些方法,相应地它的查找是从根节点开始的。
下面是一个使用XPath查找元素的示例:
>>> for elem in tree.iterfind(''branch/sub-branch''):
... print elem.tag, elem.attrib
...
sub-branch {''name'': ''subrelease01''}
上面的代码返回了branch元素之下所有tag为sub-branch的元素。接下来查找所有具备某个name属性的branch元素:
>>> for elem in tree.iterfind(''branch[@name="release01"]''):
... print elem.tag, elem.attrib
...
branch {''hash'': ''f200013e'', ''name'': ''release01''}
4、构建XML文档
利用ET,很容易就可以完成XML文档构建,并写入保存为文件。ElementTree对象的write方法就可以实现这个需求。
一般来说,有两种主要使用场景。一是你先读取一个XML文档,进行修改,然后再将修改写入文档,二是从头创建一个新XML文档。
修改文档的话,可以通过调整Element对象来实现。请看下面的例子:
>>> root = tree.getroot()
>>> del root[2]
>>> root[0].set(''foo'', ''bar'')
>>> for subelem in root:
... print subelem.tag, subelem.attrib
...
branch {''foo'': ''bar'', ''hash'': ''1cdf045c'', ''name'': ''codingpy.com''}
branch {''hash'': ''f200013e'', ''name'': ''release01''}
在上面的代码中,我们删除了root元素的第三个子元素,为第一个子元素增加了新属性。这个树可以重新写入至文件中。最终的XML文档应该是下面这样的:
>>> import sys
>>> tree.write(sys.stdout)
<doc>
<branch foo="bar" hash="1cdf045c" name="codingpy.com">
text,source
</branch>
<branch hash="f200013e" name="release01">
<sub-branch name="subrelease01">
xml,sgml
</sub-branch>
</branch>
</doc>
请注意,文档中元素的属性顺序与原文档不同。这是因为ET是以字典的形式保存属性的,而字典是一个无序的数据结构。当然,XML也不关注属性的顺序。
从头构建一个完整的文档也很容易。ET模块提供了一个SubElement工厂函数,让创建元素的过程变得很简单:
>>> a = ET.Element(''elem'')
>>> c = ET.SubElement(a, ''child1'')
>>> c.text = "some text"
>>> d = ET.SubElement(a, ''child2'')
>>> b = ET.Element(''elem_b'')
>>> root = ET.Element(''root'')
>>> root.extend((a, b))
>>> tree = ET.ElementTree(root)
>>> tree.write(sys.stdout)
<root><elem><child1>some text</child1><child2 /></elem><elem_b /></root>
拿例子敲下
python xml解析之 xml.etree.ElementTree
import xml.etree.ElementTree as tree
import io
xml = ''''''<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
''''''
parse = tree.fromstring(xml) #type:tree.Element #根节点
for e in parse: #遍历
print(e.tag) # 节点名称
print(e.attrib.get(''name''))#节点属性
result = parse.findall(''country'') # 只能找到子节点 第一层
print(result) #[<Element ''country'' at 0x0000000001DDE7C8>, <Element ''country'' at 0x000000000291F908>, <Element ''country'' at 0x000000000291FA98>]
print([e for e in parse.iter(''rank'') if e.attrib.get(''updated'') == ''yes'']) #递归遍历所有
#父节点 parse 添加子节点
print(tree.SubElement(parse, ''test'', attrib={''name'': ''ceshi''})) #工厂方式添加子节点
print(tree.tostring(parse).decode(''utf-8'')) #输出xml文档
今天关于使用Python ElementTree创建不带ns0命名空间的SVG / XML文档和python elementtree生成xml的介绍到此结束,谢谢您的阅读,有关Python ElementTree 将两个 XML 文件与第一个命名空间合并、python xml.etree.ElementTree遍历xml所有节点实例详解、python XML文件解析:用ElementTree解析XML、python xml解析之 xml.etree.ElementTree等更多相关知识的信息可以在本站进行查询。
本文标签: