xml模块

Posted dongzhihaoya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xml模块相关的知识,希望对你有一定的参考价值。

1.什么是xml(可扩展标记语言)

是一种定义电子文档结构和描述的语言,可以用来标记数据、定义数据类型

用户可以对自己的标记语言进行定义和扩展,由W3C(万维网标准组织)推出,几乎所有的编程语言都支持该格式

标记翻译为标签,标签指的是某种特殊符号,简单的是XML就是用标签来定义文档结构

xml文档格式

<person name="jack">hello i am a person</person>

一个完整的标签分为三个部分
标签名(tagname): person
属性(attribute): name(值为jack)
文本(text): hello i am a person
其中属性和文本都是可选的,所以可以定义一个空标签
<person></person>

格式:

一、任何的起始标签都必须有一个结束标签。

二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如。XML解析器会将其翻译成。

三、标签必须按顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。

四、所有的属性都必须有值。

五、所有的特性都必须在值的周围加上双引号。

六、最外层必须有且只能有一个标签,称为根标签

 

2.与json对比

json是javascript语言的对象表示法,仅支持js中的数据类型,(虽然大多数情况下是足够使用的),之所以出现是因为在开发中,通常都需要后台像前台传输数据,所以传输前台能看懂的数据格式,json就是这样一种数据格式,可以轻松的被js语言解析,使用场景多为前后台交互

xml支持的数据类型理论上是不受限制的,因为可以完全自定义标签的结构和含义,使用场景也非常广泛,不局限于前后台的数据交互,在一些语言中还经常作为配置文件来使用。html也属于xml

3.使用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>

解析xml

import xml.etree.ElementTree as ET
 
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
 
#遍历xml文档
for child in root:
    print(========>,child.tag,child.attrib,child.attrib[name])
    for i in child:
        print(i.tag,i.attrib,i.text)
 
#只遍历year 节点
for node in root.iter(year):
    print(node.tag,node.text)
#---------------------------------------
?
import xml.etree.ElementTree as ET
 
tree = ET.parse("xmltest.xml")
root = tree.getroot()
 
#修改
for node in root.iter(year):
    new_year=int(node.text)+1
    node.text=str(new_year)
    node.set(updated,yes)
    node.set(version,1.0)
tree.write(test.xml)
 
 
#删除node
for country in root.findall(country):
   rank = int(country.find(rank).text)
   if rank > 50:
     root.remove(country)
 
tree.write(output.xml)
1.三个用于查找标签函数
iter("标签名") #全文查找
find("标签名") #查找子节点匹配的第一个
findall("标签名") #查找字节点匹配的所有

2.访问标签的内容
element.tag 获取标签名
element.attrib 获取属性
element.text 获取文本

3.修改文档内容
elment.tag = "标签名"
element.text = "文本"
element.set("属性名","属性值")

4.删除节点
root.remove(标签对象)

5.添加子标签
#创建标签对象
year2=ET.Element(year2) # 指定名称
year2.text=新年 
year2.attrib={update:yes}
#添加
country.append(year2) #往country节点下添加子节点


删除添加修改后都需要调用write写入到文件
tree.write("文件名"),#注意文档对象才能执行写入操作

代码生成XML文档

import xml.etree.ElementTree as ET
 new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = man
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = 19
et = ET.ElementTree(new_xml) #生成文档对象
et.write("test.xml", encoding="utf-8",xml_declaration=True)
 
ET.dump(new_xml) #打印生成的格式

xml的解析比起json而言非常复杂 因为其扩展性远比json高,在java中常作为配置文件,当你在前后台进行数据交互时,优先是用json格式

 

疑惑:文本也可以作为属性,属性也可以作为文本,?到底如何选择?, XML不仅仅可以定义数据结构还可以定义数据的显示样式,想想HTML!

 




以上是关于xml模块的主要内容,如果未能解决你的问题,请参考以下文章

xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException

需要示例代码片段帮助

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

如何有条件地将 C 代码片段编译到我的 Perl 模块?

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

创建片段而不从 java 代码实例化它