xml模块:
主要来自官方文档:
1. XML tree and elements
XML是一种固有的分层数据格式,最自然的方式来表示它是一棵树。ET有两个类用于此目的 - ElementTree将整个XML文档表示为树,Element表示此树中的单个节点。与整个文档(从文件读取和写入文件)的交互通常在ElementTree级别上进行。与单个XML元素及其子元素的交互在Element级别上完成。
2.XML长这个样子eg:
test.xml
3.解析:
从文件读取来导入此数据
import xml.etree.ElementTree as ET
In [182]: tree=ET.parse("test.xml")
In [183]: tree
Out[183]: <xml.etree.ElementTree.ElementTree at 0x10ba550>
得到根节点
In [184]: root = tree.getroot()
In [185]: root
Out[185]: <Element 'data' at 0x010AAAB0> |
或直接从字符串:
root = ET.fromstring(country_data_as_string) |
注意:这里有个坑:
不能有这一行:
有的话就会报错.
4.方法:
In [272]: list(root.iter("year"))
Out[272]:
[<Element 'year' at 0x00B503F0>,
<Element 'year' at 0x00B502A0>,
<Element 'year' at 0x00B50300>] |
修改内容:'
eg:给所有的year加一:
In [319]: for i in root.iter("year"):
...: print(i.text)
...: i.text=str(int(i.text)+1)
...: |
eg:给year标签新加属性:
In [322]: for i in root.iter("year"):
...: i.set("hahha","en")
...:
...: |
eg"新建一个xml文档"
import xml.etree.ElementTree as ET
root=ET.Element("People")
name = ET.SubElement(root,"name",attrib={"test":"测试"})
age = ET.SubElement(name,"rage",attrib={})
age.text='100'
name.text="小明明"
et = ET.ElementTree(root)
et.write("tt.xml",encoding="utf-8",)
|
补充:
element:
class xml.etree.ElementTree.Element(tag, attrib={}, **extra)
tag 即标签
一个字符串,用于标识此元素表示的数据类型(换句话说,元素类型)。
text 即<rank>68</rank>
tail
这些属性可用于保存与元素关联的其他数据。它们的值通常是字符串,但可以是任何特定于应用程序的对象。If the element is created from an XML file, the text attribute holds either the text between the element's start tag and its first child or end tag, or None, and the tail attribute holds either the text between the element's end tag and the next tag, or None. 对于XML数据
attrib
即:
<neighbor name="Colombia" direction="E"/>
返回值为一个字典类型{} |
包含元素属性的字典。注意,虽然attrib值总是一个真正可变的Python字典,但是ElementTree实现可以选择使用另一个内部表示,并且只有在有人请求时才创建字典。要利用这样的实现,尽可能使用下面的字典方法。
以下类似字典的方法适用于元素属性。
clear()
重置元素。此函数删除所有子元素,清除所有属性,并将文本和尾部属性设置为None。
get(key, default=None)
获取名为键的元素属性
In [251]: list(root)[0].get("name")
Out[251]: 'Liechtenstein' |
返回属性值,如果未找到属性,则返回default。
items()
将元素属性作为(名称,值)对的序列返回。属性以任意顺序返回。
In [252]: root.items()
Out[252]: []
In [253]: list(root)[0].items()
Out[253]: [('name', 'Liechtenstein')] |
keys()
将元素属性名称作为列表返回。以任意顺序返回名称。
set(key, value)
将元素上的属性键设置为值。
In [254]: list(root)[0].keys()
Out[254]: ['name'] |
以下方法适用于元素的子代(子元素)。
append(subelement)
将元素子元素添加到此元素的内部子元素列表的末尾。引发TypeError如果子元素不是Element。
extend(subelements)
从具有零个或多个元素的序列对象中附加子元素。如果子元素不是Element,则引发TypeError。
版本3.2中的新功能。
find(match, namespaces=None)
查找与匹配匹配的第一个子元素。match可以是标记名称或path。返回元素实例或None。命名空间是从命名空间前缀到全名的可选映射。
findall(match, namespaces=None)
按标记名称或path查找所有匹配的子元素。返回包含文档顺序中所有匹配元素的列表。命名空间是从命名空间前缀到全名的可选映射。
findtext(match, default=None, namespaces=None)
查找与匹配匹配的第一个子元素的文本。match可以是标记名称或path。返回第一个匹配元素的文本内容,如果未找到元素,则返回默认。注意,如果匹配元素没有文本内容,则返回空字符串。命名空间是从命名空间前缀到全名的可选映射。
getchildren()
自版本3.2后已弃用:使用list(elem)或迭代。
In [255]: list(root)
Out[255]:
[<Element 'country' at 0x00B40D20>,
<Element 'country' at 0x00B50120>,
<Element 'country' at 0x00B500C0>] |
getiterator(tag=None)
自版本3.2后已弃用:改用了方法Element.iter()。
In [257]: root.iter()
Out[257]: <_elementtree._element_iterator at 0xb58990>
In [258]: next( root.iter())
Out[258]: <Element 'data' at 0x010AAAB0> |
insert(index, subelement)
在此元素中的给定位置插入子元素。引发TypeError如果子元素不是Element。
iter(tag=None)
以当前元素为根创建树iterator。迭代器以文档(深度优先)顺序遍历该元素及其下面的所有元素。如果标签不是None或'*',则只有标签等于标签的元素才会从迭代器返回。如果在迭代期间修改树结构,则结果是未定义的。
版本3.2中的新功能。
iterfind(match, namespaces=None)
按标记名称或path查找所有匹配的子元素。返回一个迭代,产生文档顺序中的所有匹配元素。命名空间是从命名空间前缀到全名的可选映射。
版本3.2中的新功能。
itertext()
创建文本迭代器。迭代器按照文档顺序循环遍历该元素和所有子元素,并返回所有内部文本。
版本3.2中的新功能。
makeelement(tag, attrib)
创建与此元素具有相同类型的新元素对象。不要调用此方法,请改用SubElement()工厂函数。
remove(subelement)
从元素中删除子元素。与find *方法不同,此方法基于实例标识比较元素,而不是标记值或内容。
Element objects also support the following sequence type methods for working with subelements: __delitem__(), __getitem__(), __setitem__(), __len__().
注意:没有子元素的元素将测试为False。此行为将在以后的版本中更改。使用特定len(elem)或elem 是 无