`
喜欢蓝色的我
  • 浏览: 370476 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

ElementTree(元素树)(三)

 
阅读更多

1.引入库
需要用到3个类,ElementTree,Element以及建立子类的包装类SubElement 
from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement as SE

2.读入并解析
tree = ElementTree(file=xmlfile)
root = tree.getroot()
读入后,tree是ElementTree的类型,获取xml根结点使用getroot()方法;

XML示例文件:

复制代码代码如下:

<item sid='1712' name = '大CC'  >
<a id=1></a>
<a id=2></a>
</item>

3.获取儿子结点
查找Element的所有子结点:

复制代码代码如下:

AArry = item.findall('a')
也可使用getchildren():
childs =  item.getchildren()
     for subItem in childs:
           print subItem.get('id')

4.插入儿子结点
方法一:

复制代码代码如下:

 item = Element("item", {'sid' : '1713', 'name' : 'ityouhui'})
 root.append(item)


方法二:

复制代码代码如下:

 


SE(root,'item',{'sid':'1713','name':'ityouhui'})


法一的好处是插入之后可以对item继续操作。法二是写法上简单,其中SE就是SubElement,在引入处做了声明;

5.操作属性
获取Element的某个属性值(eg:获取item的 name)

复制代码代码如下:

print root.find('item/name').text
print item.get('name')


获取Element所有属性

复制代码代码如下:

 


print item.items()       # [('sid', '1712'), ('name', '大CC')]
print item.attrib        # {'sid': '1712', 'name': '大CC'}

6.美化XML
在写入之前,传入root调用此函数,写入的XML文件格式整齐美观:

复制代码代码如下:

indent(root)
book.write(xmlfile,'utf-8')
复制代码代码如下:

## Get pretty look
def indent( elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        for e in elem:
            indent(e, level+1)
        if not e.tail or not e.tail.strip():
            e.tail = i
    if level and (not elem.tail or not elem.tail.strip()):
        elem.tail = i
    return elem
源:http://www.jb51.net/article/43999.htm
-----------------------------------------------------------------------------------------------------------------------------------------------

来自 XPath 的帮助

为了寻找我们感兴趣的元素,一个更加有效的办法是使用 XPath 支持。 Element 有一些关于寻找的方法可以接受 XPath 作为参数。 find 返回第一个匹配的子元素, findall 以列表的形式返回所有匹配的子元素, iterfind 为所有匹配项提供迭代器。这些方法在 ElementTree 里面也有。

给出一个例子:

>>> for elem in tree.iterfind('branch/sub-branch'):
...   print elem.tag, elem.attrib
...
sub-branch {'name': 'subrelease01'}

这个例子在 branch 下面找到所有标签为 sub-branch 的元素。然后给出如何找到所有的 branch 元素,用一个指定 name 的状态即可:

>>> for elem in tree.iterfind('branch[@name="release01"]'):
...   print elem.tag, elem.attrib
...
branch {'hash': 'f200013e', 'name': 'release01'}


建立 XML 文档

ET 提供了建立 XML 文档和写入文件的便捷方式。 ElementTree 对象提供了 write 方法。

现在,这儿有两个常用的写 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': 'testing'}
branch {'hash': 'f200013e', 'name': 'release01'}

我们在这里删除了根元素的第三个子结点,然后为第一个子结点增加新状态。然后这个树可以写回到文件中。

>>> import sys
>>> tree.write(sys.stdout)   # ET.dump can also serve this purpose
<doc>
    <branch foo="bar" hash="1cdf045c" name="testing">
        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>

使用 iterparse 来处理 XML 流

就像我在文章一开头提到的那样,XML 文档通常比较大,所以将它们全部读入内存的库可能会有点儿小问题。这也是为什么我建议使用 SAX API 来替代 DOM 。

我们刚讲过如何使用 ET 来将 XML 读入内存并且处理。但它就不会碰到和 DOM 一样的内存问题么?当然会。这也是为什么这个包提供一个特殊的工具,用来处理大型文档,并且解决了内存问题,这个工具叫 iterparse 

我给大家演示一个 iterparse 如何使用的例子。我用 自动生成 拿到了一个 XML 文档来进行说明。这只是开头的一小部分:

<?xml version="1.0" standalone="yes"?>
<site>
    <regions>
        <africa>
            <item id="item0">
                <location>United States</location>    <!-- Counting locations -->
                <quantity>1</quantity>
                <name>duteous nine eighteen </name>
                <payment>Creditcard</payment>
                <description>
                    <parlist>
[...]

我已经用注释标出了我要处理的元素,我们用一个简单的脚本来计数有多少 location 元素并且文本内容为“Zimbabwe”。这是用 ET.parse 的一个标准的写法:

tree = ET.parse(sys.argv[2])

count = 0
for elem in tree.iter(tag='location'):
    if elem.text == 'Zimbabwe':
        count += 1
print count

所有 XML 树中的元素都会被检验。当处理一个大约 100MB 的 XML 文件时,占用的内存大约是 560MB ,耗时 2.9 秒。

注意:我们并不需要在内存中加载整颗树。它检测我们需要的带特定值的 location 元素。其他元素被丢弃。这是 iterparse 的来源:

count = 0
for event, elem in ET.iterparse(sys.argv[2]):
    if event == 'end':
        if elem.tag == 'location' and elem.text == 'Zimbabwe':
            count += 1
    elem.clear() # discard the element

print count

这个循环遍历 iterparse 事件,检测“闭合的”(end)事件并且寻找 location 标签和指定的值。在这里 elem.clear() 是关键 - iterparse 仍然建立一棵树,只不过不需要全部加载进内存,这样做可以有效的利用内存空间(见注释7)。

处理同样的文件,这个脚本占用内存只需要仅仅的 7MB ,耗时 2.5 秒。速度的提升归功于生成树的时候只遍历一次。相比较来说, parse 方法首先建立了整个树,然后再次遍历来寻找我们需要的元素(所以慢了一点)。

分享到:
评论

相关推荐

    elementtree-1.2.6-20050316.tar

    在 ElementTree 中,XML 文档被解析为一棵元素树,其中每个节点都是一个 Element 对象,代表 XML 文档中的一个元素。Element 对象包含属性、文本内容以及子元素。通过这个树形结构,我们可以方便地遍历和操作 XML ...

    9.7. xml.etree.ElementTree — ElementTree XML的接口(翻译).pdf

    这个模块采用了元素树(ElementTree)数据结构来表示XML数据,元素树是包含多个节点的树状结构,每个节点都可能有子节点,就像文件系统一样。 元素树中的每个元素被称为Element,它代表XML树中的一个节点。每个...

    Node.JS XML 解析 node-elementtree.zip

    在 `node-elementtree` 中,XML 文档被解析成一个元素树,每个元素都是一个对象,包含了标签、属性、文本内容以及子元素等信息。你可以通过这个对象模型轻松地遍历、修改或创建 XML 结构。例如,你可以通过元素的 `...

    python使用ElementTree类 处理XML

    ElementTree 模块的主要功能是将 XML 文档解析成树形结构,使得开发者可以方便地访问和操作 XML 元素。ElementTree 模块提供了多种方法来解析 XML 文档,包括 parse() 方法和 fromstring() 方法。 在这篇实例中,...

    element tree

    在本项目中,我们将关注如何使用Vue和Element UI来实现一个具有搜索、增删改以及节点上下移动功能的树形结构(Tree)组件。 首先,让我们深入理解“Tree”组件在前端开发中的作用。树形结构是一种数据表示形式,常...

    python_elementt_xml.zip_python xml_xml解析 python

    `ElementTree`库提供了解析XML文档为元素树(Element Tree)的方法,这使得我们可以遍历和操作XML结构。 1. **解析XML文档**:使用`ElementTree.parse()`或`ET.fromstring()`函数解析XML文件。前者用于读取整个XML...

    js代码-element tree 回显非全选的误区

    总结起来,避免"js代码-element tree 回显非全选的误区"需要理解元素树的数据结构,正确追踪和更新节点状态,处理好复选框的关联性,遵循正确的遍历顺序,并考虑异步操作的影响。通过仔细分析`main.js`中的代码和`...

    Python中使用ElementTree解析XML示例

    ElementTree (元素树)** - **描述**:ElementTree 是一种轻量级的DOM实现方式,具有简洁易用的API。 - **优点**:代码简洁,速度快,内存消耗少。 - **缺点**:功能相比DOM有所限制。 #### ElementTree解析实例 ...

    利用 Python ElementTree 生成 xml的实例

    生成XML文件的基本步骤是构建元素树,然后将其写入文件或转换为字符串。下面是如何创建XML树的示例: 1. **创建根节点**:`Element`函数用于创建XML元素。例如,创建一个名为`root`的根节点: ```python root = ...

    浅谈python的elementtree模块处理中文注意事项

    # 将元素树写入文件 tree = ET.ElementTree(root) tree.write('output.xml', encoding='utf-8', xml_declaration=True) ``` 对于XML的处理,XPath是一种强大的查询语言,可以用来选取XML文档中的节点。`ElementTree...

    好看的树样式tree

    "好看的树样式tree"是一个专为JavaScript设计的可折叠树样式,旨在提供一种美观且用户友好的方式来呈现分组列表。这个解决方案通过简单的封装,使得开发者能够轻松地在自己的项目中应用和扩展。 1. **JavaScript ...

    tabletree4J 树形菜单,无限级,有demo

    树形菜单是一种常见的用户界面元素,常用于网站导航、文件管理器等,通过节点的展开和折叠,清晰地展现层级关系。无限级则意味着tabletree4J可以处理任意深度的层级结构,这对于那些需要展示复杂层级关系的系统来说...

    Python创建xml文件示例

    在Python中创建XML文件是通过使用内置的`xml.etree.ElementTree`模块来实现的。这个模块提供了方便的API来创建、解析和处理XML数据。本示例将详细讲解如何利用`ElementTree`来创建一个XML文件。 首先,导入所需的...

    Element-ui tree组件自定义节点使用方法代码详解

    Tree组件是Element UI中的一个重要组件,它以树形结构展示信息,常用于文件目录展示、组织架构展示等场景。在实际使用中,我们可能需要自定义节点的内容和样式,以满足特定的业务需求。 在提供的内容中,通过实例...

    element-tree:自定义右键菜单等等

    元素树 一个Vue.js项目 效果 构建设置 # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm run build # build for ...

    纯JS+HTML写的checkBox Tree 级联选中 好用无BUG

    在前端开发中,CheckBox Tree(复选框树)是一种常见的组件,用于展示具有层级关系的数据,并支持用户进行多级选择。这个"纯JS+HTML写的checkBox Tree 级联选中"实例,解决了其他示例中可能存在的BUG,提供了一个...

    Tree菜单上下移动

    Tree菜单是一种图形用户界面(GUI)元素,它以层级方式展示数据。每个菜单项称为一个节点,包含一个标题和可能的子节点。节点可以展开或折叠,以显示或隐藏其子节点。这种结构有助于用户理解和操作复杂的数据结构,...

    Python如何对XML 解析

    解析后的结果是一个ElementTree对象,可以通过它的根元素(`ElementTree.getroot()`)访问整个XML结构,每个Element代表XML的一个元素,有子元素、属性和文本内容。 总的来说,选择哪种XML解析方法取决于具体的需求...

Global site tag (gtag.js) - Google Analytics