GVKun编程网logo

如何获得Python的ElementTree精美打印到XML文件?(python elementtree生成xml)

16

想了解如何获得Python的ElementTree精美打印到XML文件?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于pythonelementtree生成xml的相关问题,此外,我们还将

想了解如何获得Python的ElementTree精美打印到XML文件?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于python elementtree生成xml的相关问题,此外,我们还将为您介绍关于Python ElementTree 将两个 XML 文件与第一个命名空间合并、python XML ElementTree的增删改查、python xml.etree.ElementTree遍历xml所有节点实例详解、python XML文件解析:用ElementTree解析XML的新知识。

本文目录一览:

如何获得Python的ElementTree精美打印到XML文件?(python elementtree生成xml)

如何获得Python的ElementTree精美打印到XML文件?(python elementtree生成xml)

背景

我正在使用SQLite访问数据库并检索所需的信息。我正在Python 2.6版中使用ElementTree来创建具有该信息的XML文件。

import sqlite3import xml.etree.ElementTree as ET# NOTE: Omitted code where I acccess the database,# pull data, and add elements to the treetree = ET.ElementTree(root)# Pretty printing to Python shell for testing purposesfrom xml.dom import minidomprint minidom.parseString(ET.tostring(root)).toprettyxml(indent = "   ")#######  Here lies my problem  #######tree.write("New_Database.xml")

尝试次数

我已经尝试使用tree.write("New_Database.xml", "utf-8")它代替上面的最后一行代码,但是它根本没有编辑XML的布局-
仍然是一团糟。

我还决定摆弄一下,然后尝试做:而不是将其打印到Python shell上,这会产生错误
AttributeError:’unicode’对象没有属性’write’*
tree = minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
*

问题

当我在最后一行将树写入XML文件时,是否有办法像在Python Shell上一样漂亮地打印到XML文件?

我可以toprettyxml()在这里使用还是有其他方法来做到这一点?

答案1

小编典典

无论您的XML字符串是什么,您都可以通过打开一个用于将字符串写入文件的文件将其写入您选择的文件中。

from xml.dom import minidomxmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent="   ")with open("New_Database.xml", "w") as f:    f.write(xmlstr)

有一种可能的复杂性,尤其是在Python
2中,它对字符串中的Unicode字符的要求不那么严格,也不太复杂。如果您的toprettyxml方法退回Unicode字符串(u"something"),则可能需要将其转换为合适的文件编码,例如UTF-8。例如,将一个写行替换为:

f.write(xmlstr.encode(''utf-8''))

Python ElementTree 将两个 XML 文件与第一个命名空间合并

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 ElementTree的增删改查

python XML ElementTree的增删改查

import xml.etree.ElementTree as ET

"""
    ElementTree.write()       将构建的XML文档写入(更新)文件。
    Element.set(key, value)   添加和修改属性
    Element.text = ''''         直接改变字段内容
    Element.remove(Element)   删除Element节点
    Element.append(Element)   为当前的Elment对象添加子对象
    ET.SubElement(Element,tag)创建子节点 
"""

#  增加自动缩进换行
def indent(elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i
            

#------------新增XML----------

#创建根节点
a = ET.Element("student")
#创建子节点,并添加属性
b = ET.SubElement(a,"name")
b.attrib = {"NO.":"001"}
#添加数据
b.text = "张三"
#创建elementtree对象,写文件
indent(a,0)
tree = ET.ElementTree(a)
tree.write("writeXml.xml",encoding="utf-8")

#----------编辑XML--------
# 读取待修改文件
updateTree = ET.parse("writeXml.xml")
root = updateTree.getroot()

# --新增--

# 创建新节点并添加为root的子节点
newnode = ET.Element("name")
newnode.attrib = {"NO.":"003"}
newnode.text = "张三水"
root.append(newnode)

#---修改---

sub1 = root.findall("name")[2]
# --修改节点的属性
sub1.set("NO.","100")
# --修改节点内文本
sub1.text="陈真"

#----删除---

#--删除标签内文本
sub1.text = ""
#--删除标签的属性
del sub1.attrib["NO."]
#--删除一个节点
root.remove(sub1)


# 写回原文件
indent(root,0)
updateTree.write("writeXml.xml",encoding="utf-8", xml_declaration=True)

XML操作封装

def change_node_properties(nodelist, kv_map, is_delete=False):
    ''''''修改/增加 /删除 节点的属性及属性值
       nodelist: 节点列表
       kv_map:属性及属性值map''''''
    for node in nodelist:
        for key in kv_map:
            if is_delete:
                if key in node.attrib:
                    del node.attrib[key]
            else:
                node.set(key, kv_map.get(key))

def change_node_text(nodelist, text, is_add=False, is_delete=False):
    ''''''改变/增加/删除一个节点的文本内容
       nodelist:节点列表
       text : 更新后的文本''''''
    for node in nodelist:
        if is_add:
            node.text += text
        elif is_delete:
            node.text = ""
        else:
            node.text = text

def create_childnode(node,tag, property_map, content):
    ''''''新造一个子节点
       node:节点
       tag:子节点标签
       property_map:属性及属性值map
       content: 节点闭合标签里的文本内容
     ''''''
    element = ET.Element(tag, property_map)
    element.text = content
    node.append(element)

def del_node_by_tagkeyvalue(node, tag, kv_map):
    ''''''通过属性及属性值定位一个节点,并删除之
       node: 父节点
       tag:子节点标签
       kv_map: 属性及属性值列表''''''
    for child in node:
        if child.tag == tag and child.attrib==kv_map:
            node.remove(child)

 

python xml.etree.ElementTree遍历xml所有节点实例详解

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 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的ElementTree精美打印到XML文件?python elementtree生成xml的分享就到这里,谢谢您的阅读,如果想了解更多关于Python ElementTree 将两个 XML 文件与第一个命名空间合并、python XML ElementTree的增删改查、python xml.etree.ElementTree遍历xml所有节点实例详解、python XML文件解析:用ElementTree解析XML的相关信息,可以在本站进行搜索。

本文标签: