python3. xml.etree.ElementTree 学习记录

xml.etree.ElementTreee解析xml文件

  1. 首先贴一段xml,看官如果看的熟悉,没错.....这就是官网的
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

现在xml有了,就差把它引入解析了,可以这样来看代码:

# 首先从磁盘读取xml文件
import xml.etree.ElementTree as ET
tree = ET.parse('demo.xml')
root = tree.getroot()
# 其次我也可以从字符串中读取数据
root = ET.fromstring(demo_xml_string)

fromstring() :将字符串中xml直接解析成树结构,root为解析树的根元素.

作为树 (Element),root也有标签和属性字典,在撸个小码瞧瞧

>>> root.tag
'data'
>>> root.attrib
{}

标签为 ‘data’ ,属性字典类型为:{}

获取看官到这里也不想看这个了,后面还有大招,它还有子节点,也可以进行迭代

In [7]: for child in root:
   ...:     print child.tag, child.attrib
   ...:
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}

没个根节点下的子节点是嵌套的,也可以通过索引来访问特定的子节点,这样:

In [8]: root[0][1].text
Out[8]: '2008'

1.1 上面的方法只是初步使用魔法,还有好的方法来寻找元素.

     Element 有一些方法可以帮助递归迭代根节点下的子节点元素(子节点下还有字节点的元素...有点意识模糊了..额)

 Element.iter(): 递归寻找子节点下内容

In [15]: for n in root.iter('neighbor'):
    ...:     print n.attrib
    ...:
{'direction': 'E', 'name': 'Austria'}
{'direction': 'W', 'name': 'Switzerland'}
{'direction': 'N', 'name': 'Malaysia'}
{'direction': 'W', 'name': 'Costa Rica'}
{'direction': 'E', 'name': 'Colombia'}

 Element.findall(): 查找特定元素,并且这些元素是当前元素的直接子元素

 Element.find(): 查找特定标记的第一个子元素,

 Element.text(): 访问元素的内容

 Element.get(): 访问元素属性

  撸一段小码,看看例子

In [18]: for country in root.findall('country'):
    ...:     rank = country.find('rank').text
    ...:     name = country.get('name')
    ...:     print(name, rank)
    ...:
('Liechtenstein', '1')
('Singapore', '4')
('Panama', '68')

以上寻找元素完毕了,还有支持Xpath匹配,知道看官懒得去找,小弟特奉上w3cschool 地址,以供参考

1.2 上面是读取操作xml,也许我们有用到写/修改的需求,也可以做到

ElementTree 提供构建xml并且将其写入文件的简单方法,ElementTree.write() 次方法作用于写xml到文件,可以通过直接更改其字段 (Element.text),添加和修改属性Element.set()方法 ,添加子节点Element.append() 来操作对象

下面用这个例子,假设想在每个国家/地区的排名中添加一个并更新在rank添加一个新元素

In [32]: for rank in root.iter('rank'):
    ...:     new_rank = int(rank.text) + 1
    ...:     rank.set('updated', 'yes')
    ...:

In [33]: tree.write('output.xml')


#####更新后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>

也可以使用删除元素Element.remove() 假设我们删除排名高于50的所有国家/地区

>>> for country in root.findall('country'):
...     rank = int(country.find('rank').text)
...     if rank > 50:
...         root.remove(country)
...
>>> tree.write('output.xml')

现在在看一下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>
</data>

1.3 构建xml文档

  使用SubElement() 函数创建子元素,请看下面

In [34]: a = ET.Element('a')

In [35]: b = ET.SubElement(a, 'b')

In [36]: c = ET.SubElement(b, 'c')

In [37]: d = ET.SubElement(c, 'd')

In [38]: ET.dump(a)
<a><b><c><d /></c></b></a>

1.4 使用命名空间解析

  示例 这是包含俩个命名空间的xml示例,一个名称前缀为'fictional',另一个名称为默认名称空间.

<?xml version="1.0"?>
<actors xmlns:fictional="http://characters.example.com"
        xmlns="http://people.example.com">
    <actor>
        <name>John Cleese</name>
        <fictional:character>Lancelot</fictional:character>
        <fictional:character>Archie Leach</fictional:character>
    </actor>
    <actor>
        <name>Eric Idle</name>
        <fictional:character>Sir Robin</fictional:character>
        <fictional:character>Gunther</fictional:character>
        <fictional:character>Commander Clement</fictional:character>
    </actor>
</actors>

搜索此xml一种方法是手动将url添加到 actors标签,或者 xpath 标记属性findall()

root = fromstring(xml_text)
for actor in root.findall('{http://people.example.com}actor'):
    name = actor.find('{http://people.example.com}name')
    print name.text
    for char in actor.findall('{http://characters.example.com}character'):
        print ' |-->', char.text

搜索命名空间XML示例的更好方法是使用您自己的前缀创建一个字典,并在搜索函数中使用这些字典

ns = {'real_person': 'http://people.example.com',
      'role': 'http://characters.example.com'}

for actor in root.findall('real_person:actor', ns):
    name = actor.find('real_person:name', ns)
    print name.text
    for char in actor.findall('role:character', ns):
        print ' |-->', char.text

看下这俩种方法输出:

John Cleese
 |--> Lancelot
 |--> Archie Leach
Eric Idle
 |--> Sir Robin
 |--> Gunther
 |--> Commander Clement

1.5 Xpath 匹配支持

   ElementTree 提供了友好的xpath支持,以便在树中定位元素,

 贴一下官网演示示例:

import xml.etree.ElementTree as ET

root = ET.fromstring(countrydata)

# Top-level elements
root.findall(".")

# All 'neighbor' grand-children of 'country' children of the top-level
# elements
root.findall("./country/neighbor")

# Nodes with name='Singapore' that have a 'year' child
root.findall(".//year/..[@name='Singapore']")

# 'year' nodes that are children of nodes with name='Singapore'
root.findall(".//*[@name='Singapore']/year")

# All 'neighbor' nodes that are the second child of their parent
root.findall(".//neighbor[2]")
tag	选择具有给定标记的所有子元素。例如,spam选择指定的所有子元素spam,并spam/egg选择指定的所有孙子egg的所有命名的孩子 spam。
*	选择所有子元素。例如,*/egg 选择所有名为的孙子egg。
.	选择当前节点。这在路径的开头非常有用,表明它是一个相对路径。
//	选择当前元素下所有级别的所有子元素。例如,.//egg选择egg整个树中的所有元素。
..	选择父元素。
[@attrib]	选择具有给定属性的所有元素。
[@attrib='value']	选择给定属性具有给定值的所有元素。该值不能包含引号。
[tag]	选择具有子命名的所有元素 tag。只支持直系孩子。
[tag='text']	选择具有名为tag其完整文本内容(包括后代)的子项的所有元素等于给定的元素 text。
[position]	选择位于给定位置的所有元素。位置可以是整数(1是第一个位置),表达式last() (对于最后位置),或相对于最后位置的位置(例如last()-1)。

1.6 下面方法仅供参考

   xml.etree.ElementTree.Comment(text=None)

   xml.etree.ElementTree.dump(elem)

   xml.etree.ElementTree.fromstring(text)

   xml.etree.ElementTree.fromstringlist(sequence, parse=None)

   xml.etree.ElementTree.iselement(element)

   xml.etree.ElementTree.iterparse(source, events=None, parser=None)

   xml.etree.ElementTree.parse(source, parser=None)

   xml.etree.ElementTree.ProcessingInstruction(target, text=None)

   xml.etree.ElementTree.register_namespace(prefix, url)

   xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)

   xml.etree.ElementTree.tostring(element, encoding='us-ascii',method="xml")

   xml.etree.ElementTree.tostringlist(element, encoding='us-ascii',method='xml')

   xml.etree.ElementTree.XML(text, parser=None)

   xml.etree.ElementTree.Comment(text, parser=None)

1.7 元素对象, 供参考

  以下方法适用元素属性

  tag(): 字符串类型,标识标识次元素类型

  text():  元素内容

  attrib():  属性字典

  clear(): 清楚所有子元素

  get(key, default=None): 获取key的元素属性,返回属性值,默认None

  items(): 将元素属性以元组形式返回

  keys():  列表形式返回属性名称

  set(key, value): 将元素上的属性设置为value

 以下方法适用于元素子元素

  append(subelement): 添加子元素

  extend(subelements):零个或多个元素序列追加子元素

  find(match):查找匹配第一个子元素,返回一个元素示例或None

  findall(match): 按照标签名称寻找子元素

  findtext(match, default=None):匹配第一个子元素的文本,match可以是标签名

  insert(index, element):在元素指定位置插入子元素

  iter(tag=None): 使用当前元素作为跟创建树迭代器

  iterfind(match): 按照标签名和xpath查找所有匹配的子元素,返回迭代

  itertext():创建文本迭代器,迭代器按照文本顺序遍历元素和子元素,返回全部文本

  makeelement(tag, attrib):创建与元素具有相同类型的新元素对象

  remove(subelement): 从元素中删除子元素

注意:没有子元素的元素为False

element = root.find('foo')

if not element:  # careful!
    print "element not found, or element has no subelements"

if element is None:
    print "element not found"

至此,xml.etree.ElementTree 学习记录完毕,希望能帮到大家 SANQ.

 

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的xml.etree.ElementTree是一个用于解析和操作XML文档的模块。它提供了一种简单的方式来读取和写入XML文件,并且可以轻松地遍历XML文档的元素和属性。使用xml.etree.ElementTree模块,可以将XML文档转换为Python对象,然后对其进行操作和处理。 ### 回答2: Python xml.etree.elementtree 是一个 Python 模块,用于解析 XML 文档并创建 XML 元素树。这个模块提供了一种简单且高效的方式来处理 XML 数据,可以帮助开发者轻松地构建 Python 对象/字典和 XML 文档之间的映射。 使用 xml.etree.ElementTree,可以将 XML 文档转换为元素对象树,然后使用元素对象进行文档处理。使用这个模块可以很容易地将 XML 数据解析和转换为 Python 中的数据类型,例如列表、字典和字符串等。同时,ElementTree 还支持 XPath 表达式(XPath 是一种用于选取 XML 文档中数据的语言)。 ElementTree 将一个 XML 文档解析成一个通用的元素树结构,将每个元素作为 Python 对象中的一个元素。在几乎所有的XML处理扩展中,ElementTree都是标准的API。其重要的特点包括: 1. 简单易用的API,支持解析和生成XML; 2. 支持遍历解析XML文档; 3. 支持XPath定位; 4. 遵守XML标准,并且能够正确处理XML文档中的编码格式、属性和命名空间等细节; 5. 兼容Python3与Python2. 在Python应用领域中,XML是一种常见格式,如SOAP和RESTful Web Services、HTML、配置文件等等。使用 ElementTree,可以方便地处理这些数据供应用完成数据处理,构建XML数据请求和响应等。总之,Python xml.etree.elementtree 是一个基于 XML 的开发框架,可用于快速,可靠地构建和解析 XML 文档。 ### 回答3: Python 中的 xml.etree.elementtree 是一个用于操作 XML 数据的库。ElementTreeElement 的树形结构,允许对其进行操作并将其转换为 XML 文件或字符串。它被广泛应用于 Web 开发和数据处理,例如在面向 XML 数据的 Web 应用程序和配置文件中。 ElementTree 提供了一个对 XML 元素进行递归访问的 API。通过向 XML 解析器提供 XML 文件路径或 URL,ElementTree 可以读取 XML 文件并将其转换为一个 element 对象。通过 element 对象,我们可以获得元素的文本内容、属性、子元素、标签等信息。 ElementTree 还提供了一些实用函数,帮助我们轻松地操作 XML 数据。例如,我们可以使用 find() 和 findall() 函数搜索 Element 中的子元素,并使用 set() 函数设置元素的属性、text 属性来获取或设置元素的文本内容。 在使用 xml.etree.elementtree 进行 XML 数据处理时,我们还可以使用 lxml、BeautifulSoup 和 html5lib 等库,以便更方便地解析、操作和处理 XML 数据。 总之,Python 中的 xml.etree.elementtree 提供了强大的 XML 数据处理功能,使得我们可以轻松地访问、解析和操作 XML 数据。无论是 Web 应用程序还是常规数据处理,ElementTree 都是一个值得信赖和广泛运用的库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值