6.5 å°†å—典转æ�¢ä¸ºXML¶
问题¶
ä½ æƒ³ä½¿ç”¨ä¸€ä¸ªPythonå—å…¸å˜å‚¨æ•°æ�®ï¼Œå¹¶å°†å®ƒè½¬æ�¢æˆ�XMLæ ¼å¼�。
解决方案¶
尽管 xml.etree.ElementTree 库通常用��解�工作,其实它也�以创建XML文档。
例如,考虑如下这个函数:
from xml.etree.ElementTree import Element
def dict_to_xml(tag, d):
'''
Turn a simple dict of key/value pairs into XML
'''
elem = Element(tag)
for key, val in d.items():
child = Element(key)
child.text = str(val)
elem.append(child)
return elem
下é�¢æ˜¯ä¸€ä¸ªä½¿ç”¨ä¾‹å�:
>>> s = { 'name': 'GOOG', 'shares': 100, 'price':490.1 }
>>> e = dict_to_xml('stock', s)
>>> e
<Element 'stock' at 0x1004b64c8>
>>>
转æ�¢ç»“果是一个 Element 实例。对于I/Oæ“�作,使用 xml.etree.ElementTree ä¸çš„ tostring()
函数很容易就能将它转æ�¢æˆ�一个å—节å—符串。例如:
>>> from xml.etree.ElementTree import tostring
>>> tostring(e)
b'<stock><price>490.1</price><shares>100</shares><name>GOOG</name></stock>'
>>>
å¦‚æžœä½ æƒ³ç»™æŸ�ä¸ªå…ƒç´ æ·»åŠ å±žæ€§å€¼ï¼Œå�¯ä»¥ä½¿ç”¨ set() 方法:
>>> e.set('_id','1234')
>>> tostring(e)
b'<stock _id="1234"><price>490.1</price><shares>100</shares><name>GOOG</name>
</stock>'
>>>
å¦‚æžœä½ è¿˜æƒ³ä¿�æŒ�å…ƒç´ çš„é¡ºåº�,å�¯ä»¥è€ƒè™‘æž„é€ ä¸€ä¸ª OrderedDict æ�¥ä»£æ›¿ä¸€ä¸ªæ™®é€šçš„å—典。请å�‚考1.7å°�节。
讨论¶
当创建XMLçš„æ—¶å€™ï¼Œä½ è¢«é™�制å�ªèƒ½æž„é€ å—符串类型的值。例如:
def dict_to_xml_str(tag, d):
'''
Turn a simple dict of key/value pairs into XML
'''
parts = ['<{}>'.format(tag)]
for key, val in d.items():
parts.append('<{0}>{1}</{0}>'.format(key,val))
parts.append('</{}>'.format(tag))
return ''.join(parts)
é—®é¢˜æ˜¯å¦‚æžœä½ æ‰‹åŠ¨çš„åŽ»æž„é€ çš„æ—¶å€™å�¯èƒ½ä¼šç¢°åˆ°ä¸€äº›éº»çƒ¦ã€‚例如,当å—典的值ä¸åŒ…å�«ä¸€äº›ç‰¹æ®Šå—ç¬¦çš„æ—¶å€™ä¼šæ€Žæ ·å‘¢ï¼Ÿ
>>> d = { 'name' : '<spam>' }
>>> # String creation
>>> dict_to_xml_str('item',d)
'<item><name><spam></name></item>'
>>> # Proper XML creation
>>> e = dict_to_xml('item',d)
>>> tostring(e)
b'<item><name><spam></name></item>'
>>>
注æ„�到程åº�çš„å�Žé�¢é‚£ä¸ªä¾‹å�ä¸ï¼Œå—符 ‘<’ å’Œ ‘>’ 被替æ�¢æˆ�了 < å’Œ >
下é�¢ä»…ä¾›å�‚è€ƒï¼Œå¦‚æžœä½ éœ€è¦�手动去转æ�¢è¿™äº›å—符,
å�¯ä»¥ä½¿ç”¨ xml.sax.saxutils ä¸çš„ escape() å’Œ unescape() 函数。例如:
>>> from xml.sax.saxutils import escape, unescape
>>> escape('<spam>')
'<spam>'
>>> unescape(_)
'<spam>'
>>>
除了能创建æ£ç¡®çš„输出外,还有å�¦å¤–ä¸€ä¸ªåŽŸå› æŽ¨è��ä½ åˆ›å»º Element 实例而ä¸�是å—符串,
那就是使用å—符串组å�ˆæž„é€ ä¸€ä¸ªæ›´å¤§çš„æ–‡æ¡£å¹¶ä¸�是那么容易。
而 Element 实例�以�用考虑解�XML文本的情况下通过多�方�被处�。
ä¹Ÿå°±æ˜¯è¯´ï¼Œä½ å�¯ä»¥åœ¨ä¸€ä¸ªé«˜çº§æ•°æ�®ç»“构上完æˆ�ä½ æ‰€æœ‰çš„æ“�作,并在最å�Žä»¥å—符串的形å¼�将其输出。