ホームページ  >  記事  >  バックエンド開発  >  Pythonネットワークプログラミング学習記(8):XML生成と解析(DOM、ElementTree)

Pythonネットワークプログラミング学習記(8):XML生成と解析(DOM、ElementTree)

WBOY
WBOYオリジナル
2016-06-16 08:43:531172ブラウズ

xml.dom篇

    DOM是Document Object Model的简称,XML 文档的高级树型表示。该模型并非只针对 Python,而是一种普通XML 模型。Python 的 DOM 包是基于 SAX 构建的,并且包括在 Python 2.0 的标准 XML 支持里。

一、xml.dom的简单介绍

1、主要方法:

minidom.parse(filename):加载读取XML文件
doc.documentElement:获取XML文档对象
node.getAttribute(AttributeName):获取XML节点属性值
node.getElementsByTagName(TagName):获取XML节点对象集合
node.childNodes :返回子节点列表。
node.childNodes[index].nodeValue:获取XML节点值
node.firstChild:访问第一个节点,等价于pagexml.childNodes[0]
返回Node节点的xml表示的文本:
doc = minidom.parse(filename)
doc.toxml('UTF-8')

访问元素属性:

Node.attributes["id"]
a.name #就是上面的 "id"
a.value #属性的值 

2、举例说明

例1:文件名:book.xml

复制代码 代码如下:



   Book message
   
        bookone
        python check
        001
        200
   

   
        booktwo
        python learn
        002
        300
   


(1)创建DOM对象

复制代码 代码如下:

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')

(2)获取根字节

root=dom1.documentElement #这里得到的是根节点
print root.nodeName,',',root.nodeValue,',',root.nodeType

返回结果为:

info , None , 1

其中:

info是指根节点的名称root.nodeName
None是指根节点的值root.nodeValue

1是指根节点的类型root.nodeType,更多节点类型如下表:

NodeType

Named Constant

1

ELEMENT_NODE

2

ATTRIBUTE_NODE

3

TEXT_NODE

4

CDATA_SECTION_NODE

5

ENTITY_REFERENCE_NODE

6

ENTITY_NODE

7

PROCESSING_INSTRUCTION_NODE

8

COMMENT_NODE

9

DOCUMENT_NODE

10

DOCUMENT_TYPE_NODE

11

DOCUMENT_FRAGMENT_NODE

12

NOTATION_NODE


(3) 子要素および子ノードへのアクセス

A. ルート子ノードのリストを返します

コードをコピー コードは次のとおりです:

import xml.dom.minidom
dom1=xml.dom。 minidom.parse ('book.xml')
root=dom1.documentElement
#print root.nodeName,',',root.nodeValue,',',root.nodeType
print root.childNodes

実行結果は次のとおりです:

[ ;, , , ]

B. XML ノード値を取得します (ルート ノードの下の 2 番目の子ノード イントロの値と名前を返すなど)。次の文を追加します

コードをコピー コードは次のとおりです:

print root.childNodes[1].nodeName,root.childNodes[1] ].nodeValue

実行結果は次のとおりです:

イントロなし

C. 最初のノードにアクセスします

コードをコピー コードは次のとおりです:

print root.firstChild.nodeName

実行結果は次のとおりです:

#テキスト

D. 既知の要素名の値を取得します。イントロの後にブックメッセージを取得したい場合は、次のメソッドを使用できます。

コードをコピー コードは次のとおりです:
import xml.dom.minidom
dom1=xml.dom。 minidom.parse ('book.xml')
root=dom1.documentElement
#print root.nodeName,',',root.nodeValue,',',root.nodeType
node= root.getElementsByTagName ('intro ')[0]
node.childNodes のノード:
if node.nodeType in (node.TEXT_NODE,node.CDATA_SECTION_NODE):
print node.data

この方法の欠点は、型を判断する必要があり、あまり使いにくいことです。実行結果は次のとおりです:

予約メッセージ

2. XML 解析

上記の XML を解析します

方法 1 のコードは次のとおりです:

コードをコピーします コードは次のとおりです:
#@小五义http://www.cnblogs.com/ xiaowuyi
#xml 解析
import xml.dom.minidom

dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
book={}
booknode=root。 getElementsByTagName('list')
booknode の booklist:
print '='*20
print 'id:'+booklist.getAttribute('id')
booklist.childNodes のノードリスト:
if nodelist.nodeType ==1:
print nodelist.nodeName+':',
for nodelist.childNodes:
print node.data

実行結果は次のとおりです:

====================

id:001
ヘッド: bookone
名前: Python チェック
番号: 001
ページ: 200
====================
id:002
頭: booktwo
名前: Python 学習
番号: 002
ページ: 300

方法 2:

コード:

コードをコピーします コードは次のとおりです:
#@小五义http://www.cnblogs.com/ xiaowuyi
#xml 解析
import xml.dom.minidom

dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
book={}
booknode=root。 getElementsByTagName('list')
ブックノードのブックリストの場合:
print '='*20
print 'id:'+booklist.getAttribute('id')
print 'head:'+booklist .getElementsByTagName('head')[0].childNodes[0].nodeValue.strip()
print 'name:'+booklist.getElementsByTagName('name')[0].childNodes[0].nodeValue.strip ()
print 'number:'+booklist.getElementsByTagName('number')[0].childNodes[0].nodeValue.strip()
print 'page:'+booklist.getElementsByTagName('page') [0].childNodes[0].nodeValue.strip()

実行結果は方法 1 と同じです。上記の 2 つの方法を比較すると、方法 1 は XML ツリー構造に基づいて複数のループを実行するため、各ノードを直接操作する方法ほど読みやすくはありません。より多くのメソッド プログラムを呼び出すには、リストとストレージ用の辞書を使用できます。詳細については、メソッド 3:

を参照してください。

コードをコピー コードは次のとおりです:

#@小五义 http://www.cnblogs.com/xiaowuyi
#xml 解析
import xml.dom.minidom
dom1=xml.dom.minidom.parse( 'book.xml')
root=dom1.documentElement
book=[]
booknode=root.getElementsByTagName('list')
ブックノード内のブックリストの場合:
bookdict={}
bookdict['id']=booklist.getAttribute('id')
bookdict['head']=booklist.getElementsByTagName('head')[0].childNodes[0].nodeValue.strip()
bookdict['name']=booklist.getElementsByTagName('name')[0].childNodes[0].nodeValue.strip()
bookdict['number']=booklist.getElementsByTagName('number')[ 0].childNodes[0].nodeValue.strip()
bookdict['page']=booklist.getElementsByTagName('page')[0].childNodes[0].nodeValue.strip()
本。 append(bookdict)
印刷ブック

実行結果:

[{'head': u'bookone', 'page': u'200', 'number': u'001', 'id': u'001', 'name': u'Python check' }, {'head': u'booktwo', 'page': u'300', 'number': u'002', 'id': u'002', 'name': u'python learn'}]

このリストには 2 つの字典が含まれています。

三、XML ファイルを構築します
ここでは、3 つの方法で得られた結果を使用して、xml ファイルを構築します。

复制代 代码如下:
# -*-coding: cp936 -*-
#@小五义http://www.cnblogs.com/xiaowuyi
#xml 创建
import xml.dom

def create_element(doc,tag,attr):
#创建一元素节点
elementNode=doc.createElement(tag)
#创建一个文本节点
textNode=doc.createTextNode(attr)
#将文本节点として元素节点の子节点
elementNode.appendChild(textNode)
return elementNode

dom1=xml.dom.getDOMImplementation()# 文書作成オブジェクト、文書オブジェクトはさまざまなポイントの作成に使用されます。

doc=dom1.createDocument(None,"info",None)
top_element = doc. documentElement# 得根节点
books=[{'head': u'bookone', 'page': u'200', 'number': u'001', 'id': u'001', 'name ': u'Python check'}, {'head': u'booktwo', 'page': u'300', 'number': u'002', 'id': u'002', 'name': u'python learn'}]
本の中の本:
sNode=doc.createElement('list')
sNode.setAttribute('id',str(book['id']))
headNode=create_element(doc,'head',book['head'])
nameNode=create_element(doc,'name',book['name'])
numberNode=create_element(doc,'number ',book['number'])
pageNode=create_element(doc,'page',book['page'])
sNode.appendChild(headNode)
sNode.appendChild(nameNode)
sNode.appendChild(pageNode)
top_element.appendChild(sNode)# 将遍历的节点追加根节点下
xmlfile=open('bookdate.xml','w')
doc.writexml(xmlfile ,addindent=' '*4, newl='n', encoding='utf-8')
xmlfile.close()

の実行後、book.xml と同様に bookdate.xml ファイルが生成されます。

xml.etree.ElementTree篇

引き続き例 1 の例を使用して、xml を解析します。

1、ダウンロードXML

方法1:ファイルを直接追加

复制代

代码如下:import xml.etree.ElementTreeroot=xml.etree.ElementTree.parse ('book.xml')



方法二:指定文字串を追加する

复制代

代码如下:import xml.etree.ElementTreeroot = xml.etree.ElementTree.fromstring (xmltext)ここでの xmltext は指定された文字列です。



2、获取节点 メソッド 1 を利用して getiterator メソッドを使用して指定されたポイントを取得します

book_node=root.getiterator("リスト")

方法 2 getchildren メソッドを利用して子ノードを取得します。例 1 では、次の子ノードの先頭のリストを取得します。

复制代

代码如下:#@小五义 http://www.cnblogs.com/xiaowuyiimport xml。 etree.ElementTreeroot=xml.etree.ElementTree.parse('book.xml')
book_node=root.getiterator("list")
book_node のノード:
book_node_child=node。 getchildren()[0]
print book_node_child.tag+':'+book_node_child.text



実行結果: 頭:本 1

頭:本 2

方法3 findとfindallを使用する方法

指定された最初の項目に到達する方法を見つける:

复制代码

代码如下:

# -*-coding: cp936 -*-
#@小五义
import xml.etree.ElementTree
root=xml.etree.ElementTree.parse('book.xml ')
book_find=root.find('list')
book_find のノート用:
print note.tag+':'+note.text

実行結果:

頭:bookone
名前:Python チェック
番号:001
ページ:200

findall メソッドは、指定されたすべてのノードを検索します:

コードをコピー コードは次のとおりです:

# -*-coding: cp936 -*-
#@小五义
import xml.etree.ElementTree
root=xml.etree.ElementTree.parse('book.xml')
book=root.findall('list')
for book_list in book:
book_list のノート:
print note.tag+':'+note.text

実行結果:

head:bookone
name:python check
number:001
page:200
head:booktwo
name:python learn
number:002
page:300

3. book.xml の解析例

コードをコピー コードは次のとおりです:

# -*-coding: cp936 -*-
#@小五义
import xml.etree.ElementTree
root=xml.etree.ElementTree.parse('book.xml')
book=root.findall('list')
for book_list in book:
print '='*20
if book_list.attrib.has_key('id'):
print "id:"+book_list.attrib['id']
(book_list のメモ用) :
print note.tag+':'+note.text
print '='*20

実行結果は次のとおりです:

====================
id:001
head:bookone
name:python check
number:001
page:200
====================
id:002
head:booktwo
name:python learn
number :002
ページ:300
====================

注:
リスト id='001' などの属性値を取得したい場合は、attrib メソッドを使用します。
例えば、bookone の bookone でノードの値を取得したい場合は text メソッドを使用します。
ノード名を取得したい場合はタグメソッドを使用します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。