XML文件--11

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)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值