XML:(优点:平台兼容性好)
1、标签成对出现(标签可自主定义,可以中文,优选英文)
2、区分大小写
3、标签要正确嵌套
4、第一行头部信息:<?xml version="1.0" encoding="utf-8"?>
5、只能有一个根节点
6、节点可以有属性
7、创建:文件后缀名为xml
DTD:约束XML文件的节点
<!DOCTYPE 根节点[
<!ELEMENT 根节点(子节点+)>(+表示出现至少一次以上)
<!ELEMENT 子节点(子节点1,子节点2)>
<!ELEMENT 子节点1(#PCDATA/表示里面是文本)>
<!ELEMENT 子节点2(#PCDATA/表示里面是文本)>
<!ATTLIST 子节点 id CDATA #REQUIRED>
]>
(#REQUIRED(必须的);#IMPLIED(不是必需的);#FIXED(属性值是固定的))
验证DTD是否写错,右击validate出现 no errors detected
例如:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE books [ <!ELEMENT books (book+)> <!ELEMENT book (bname,price,author)> <!ELEMENT bname (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ATTLIST book id CDATA #REQUIRED> ]> <!-- DTD验证--> <books> <book id="1"> <bname>西游记</bname> <price>81元</price> <author>吴承恩</author> </book> <book id="2"> <bname>红楼梦</bname> <price>89元</price> <author>曹雪芹</author> </book> <book id="3"> <bname>水浒传</bname> <price>98元</price> <author>施耐庵</author> </book> </books>
XML解析:
python有三种:SAX\DOM\ElementTree
一、dom(文档类型对象):把解析的xml整个加载到内存,组织成object树。
二、sax:事件驱动式解析,不会在内存中加载整个文档,只会根据自己编写的事件保存数据。
1、startDocument()方法 文档启动的时候调用。
2、endDocument()方法 解析器到达文档结尾时调用。
3、startElement(name, attrs)方法 遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。
4、endElement(name)方法遇到XML结束标签时调用。
5、Element:只是节点 Node:不仅获取节点,还有换行符和空格。
需导入:from xml.sax import parse
import xml.sax
例如:
from xml.sax import parse import xml.sax class Book(object): def __init__(self,bname=None,price=None,author=None): self.bname=bname self.price=price self.author=author def __str__(self): return self.bname+'\t'+self.price+'\t\t'+self.author books=[] class SaxSimple(xml.sax.ContentHandler): def __init__(self,book=None,tag=None): self.book=book def startDocument(self): print("start doc---") def startElement(self,name,attrs): if name=='book': self.book=Book() self.tag=name def characters(self,content): if self.tag=='bname': self.book.bname=content elif self.tag=='price': self.book.price=content elif self.tag=='author': self.book.author=content def endElement(self,name): if name=='book': books.append(self.book) self.book=None self.tag=None def endDocument(self): print("end doc---") parse("books.xml",SaxSimple()) for b in books: print(b)
三、elementTree解析:
纯Python:xml.etree.ElementTree
C语言:xml.etree.cElementTree (优点:速度快,占用内存少)
导入模块:
try:
import xml.etree.cElementTree as ET
except importError:
import xml.etree.ElementTree as ET
属性:
1、attrib:获取节点的属性及属性值(以元组的方式返回)
2、tag:获取节点名称
3、text:获取节点的文本值
方法:
1、parse(xmlfile) 加载xml文件
fromstring(xmltext) 加载xml文件
2、findall() 获取指定的所有节点
getiterator() 获取指定的所有节点
3、find() 获取指定的节点
getchildren() 获取节点
例如:
try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET class Book(object): def __init__(self,bname=None,price=None,author=None): self.bname=bname self.price=price self.author=author def __str__(self): return self.bname+'\t'+self.price+'\t\t'+self.author books=[] #元素树去解析 tree=ET.parse("books.xml") allbook=tree.findall("book") #print(allbook)#得到一个列表中的三个地址 book=None for b in allbook: book=Book() book.bname=b.find("bname").text book.price=b.find("price").text book.author=b.find("author").text books.append(book) for i in books: print(i)