python调⽤xml⽅法_python对XML操作
>>> deType
1
>>> root.ELEMENT_NODE
1
四、⼦元素、⼦结点的访问
访问⼦元素、⼦结点的⽅法很多,对于知道元素名字的⼦元素,可以使⽤getElementsByTagName⽅法,如读取maxid⼦元素:
>>> ElementsByTagName('maxid')
[]
这样返回⼀个列表,由于我们的例⼦中maxid只有⼀项,因此列表也只有⼀项。
如果想得到某个元素下的所有⼦结点(包括元素),可以使⽤childNodes属性:
>>> root.childNodes
[, , , , , , , , ]
可以看出所有两个标记间的内容都被视为⽂本结点。象每⾏后⾯的回车,都被看到⽂本结点。从上⾯的结果我们可以看出每个结点的类型,本例中有⽂本结点 和元素结点;结点的名字(元素结点);结点的值(⽂本结点)。每个结点都是⼀个对象,不同的结点对象有不同的属性和⽅法,更详细的要参见⽂档。由于本例⽐ 较简单,只涉及⽂本结点和元素结点。
getElementsByTagName可以搜索当前元素的所有⼦元素,包括所有层次的⼦元素。childNodes只保存了当前元素的第⼀层⼦结点。
这样我们可以遍历childNodes来访问每⼀个结点,判断它的nodeType来得到不同的内容。如,打印出所有元素的名字:
>>> for node in root.childNodes:
deType == node.ELEMENT_NODE:
deName
maxid
item
item
对于⽂本结点,想得到它的⽂本内容可以使⽤: .data属性。
对于简单的元素,如:
Python,我们可以编写这样⼀个函数来得到它的内容(这⾥为Python)。
def getTagText(root, tag):
node = ElementsByTagName(tag)[0]
rc = ""
for node in node.childNodes:
deType in ( node.TEXT_NODE, node.CDATA_SECTION_NODE):
rc = rc + node.data
return rc
这个函数只处理到的第⼀个符合的⼦元素。它会将符合的第⼀个⼦元素中的所有⽂本结点拼在⼀起。当nodeType为⽂本类结点
时,node.data为⽂本的内容。如果我们考查⼀下元素caption,我们可能看到:
[]
说明caption元素只有⼀个⽂本结点。
如果⼀个元素有属性,那么可以使⽤getAttribute⽅法,如:
>>> itemlist = ElementsByTagName('item')
>>> item = itemlist[0]
>>> Attribute('id')
u'1'
这样就得到了第⼀个item元素的属性值。
下⾯让我们简单地⼩结⼀下如何使⽤minidom来读取XML中的信息
1. 导⼊xml.dom.minidom模块,⽣成dom对象
2. 得到⽂档对象(根对象)
3. 通过getElementsByTagName()⽅法和childNodes属性(还有其它⼀些⽅法和属性)到要处理的元素
4. 取得元素下⽂本结点的内容
⼆.写⼊.
下⾯我来演⽰⼀下如何从⽆到有⽣成象l⼀样的XML⽂件。
⼀、⽣成dom对象
>>> import xml.dom.minidom
>>> impl = xml.DOMImplementation()
>>> dom = ateDocument(None, 'catalog', None)
这样就⽣成了⼀个空的dom对象。其中catalog为⽂档元素名,即根元素名。
⼆、显⽰⽣成的XML内容
每⼀个dom结点对象(包括dom对象本⾝)都有输出XML内容的⽅法,如:toxml(), toprettyxml()
toxml()输出紧凑格式的XML⽂本,如:
testtest
toprettyxml()输出美化后的XML⽂本,如:
test
test
< /catalog>
可以看出,它是将每个结点后⾯都加⼊了回车符,并且⾃动处理缩近。但对于每⼀个元素,如果元素只有⽂本内容,则我希望元素的tag与⽂本是在⼀起的,如:
test
⽽不想是分开的格式,但minidom本⾝是不⽀持这样的处理。关于如何实现形如:
test
test
< /catalog>
这样的XML格式,后⾯我们再说。
三、⽣成各种结点对象
dom对象拥有各种⽣成结点的⽅法,下⾯列出⽂本结点,CDATA结点和元素结点的⽣成过程。
1. ⽂本结点的⽣成
>>> ateTextNode('test')
test
要注意的是,在⽣成结点时,minidom并不对⽂本字符进⾏检查,象⽂本中如果出现了'
2. CDATA结点的⽣成
>>> data = ateCDATASection('aaaaaa\nbbbbbb')
>>> l()
''
CDATA是⽤于包括⼤块⽂本,同时可以不⽤转换'来包括 的。但⽂本中不可以有"]]>"这样的串存在。⽣成结点时minidom不作这些检查,只有当你输出时才有可能发现有错。
3. 元素结点的⽣成
>>> item = ateElement('caption')
>>> l()
'
'
对于象元素这样的结点,⽣成的元素结点其实是⼀个空元素,即不包含任何⽂本,如果要包含⽂本或其它的元素,我们需要使⽤appendChild() 或insertBefore()之类的⽅法将⼦结点加就到元素结点中。如将上⾯⽣成的text结点加⼊到caption元素结点中:
>>> item.appendChild(text)
< DOM Text node "test">
>>> l()
'
test'
使⽤元素对象的setAttribute()⽅法可以向元素中加⼊属性,如:
>>> item.setAttribute('id', 'idvalue')
>>> l()
'
test'
四、⽣成dom对象树
我们有了dom对象,⼜知道了如何⽣成各种结点,包括叶⼦结点(不包含其它结点的结点,如⽂本结点)和⾮叶⼦结点(包含其它结点的结点,如元素结 点)的⽣成,然后就需要利⽤结点对象本⾝的appendChild()或insertBefore()⽅法将各个结点根据在树中的位置连起来,串成⼀棵 树。最后要串到⽂档结点上,即根结点上。如⼀个完整的⽰例为:
>>> import xml.dom.minidom
>>> impl = xml.DOMImplementation()
>>> dom = ateDocument(None, 'catalog', None)
>>> root = dom.documentElement
>>> item = ateElement('item')
>>> text = ateTextNode('test')
>>> item.appendChild(text)
< DOM Text node "test">
>>> root.appendChild(item)
< DOM Element: item at 0xb9cf80>
>>> l()
< catalog>test
五、简单⽣成元素结点的函数
下⾯是我写的⼀个⼩函数,⽤于简单的⽣成类似于:
test
或形如:
的元素结点
1 def makeEasyTag(dom, tagname, value, type='text'):
2 tag = ateElement(tagname)
3 if value.find(']]>') > -1:
4 type = 'text'
5 if type == 'text':
6 value = place('&', '&')
7 value = place('
8 text = ateTextNode(value)
9 elif type == 'cdata':
10 text = ateCDATASection(value)
11 tag.appendChild(text)
12 return tag
参数说明:
dom为dom对象
tagname为要⽣成元素的名字,如'item'
value为其⽂本内容,可以为多⾏
type为⽂本结点的格式,'text'为⼀般Text结点,'cdata'为CDATA结点函数处理说明:
⾸先创建元素结点
查⽂本内容是否有']]>',如果到,则此⽂本结点只可以是Text结点
如果结点类型为'text',则对⽂本内容中的'
如果结点类型为'cdata',则⽣成CDATA结点
将⽣成的⽂本结点追加到元素结点上
因此这个⼩函数可以⾃动地处理字符转化及避免CDATA结点中出现']]>'串。
上⾯⽣成'item'结点的语句可以改为:
>>> item = makeEasyTag(dom, 'item', 'test')
>>> l()
'test'
六、写⼊到XML⽂件中
dom对象树已经⽣成好了,我们可以调⽤dom的writexml()⽅法来将内容写⼊⽂件中。writexml()⽅法语法格式为:
writexml(writer, indent, addindent, newl, encoding)
writer是⽂件对象
indent是每个tag前填充的字符,如:' ',则表⽰每个tag前有两个空格
addindent是每个⼦结点的缩近字符
python处理xml文件
newl是每个tag后填充的字符,如:'\n',则表⽰每个tag后⾯有⼀个回车
encoding是⽣成的XML信息头中的encoding属性值,在输出时minidom并不真正进⾏编码的处理,如果你保存的⽂本内容中有汉字,则需要⾃已进⾏编码转换。
writexml⽅法是除了writer参数必须要有外,其余可以省略。下⾯给出⼀个⽂本内容有汉字的⽰例:
1 >>> import xml.dom.minidom
2 >>> impl = xml.DOMImplementation()
3 >>> dom = ateDocument(None, 'catalog', None)
4 >>> root = dom.documentElement
5 >>> text = unicode('汉字⽰例', 'cp936')
6 >>> item = makeEasyTag(dom, 'item', text)
7 >>> root.appendChild(item)
8
9 >>> l()
10 u'\汉\字\⽰\例'
11 >>> f=file('d:/l', 'w')
12 >>> import codecs
13 >>> writer = codecs.lookup('utf-8')[3](f)
14 >>> dom.writexml(writer, encoding='utf-8')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论