6.6 解�和修改XML¶
问题¶
ä½ æƒ³è¯»å�–一个XML文档,对它最一些修改,然å�Žå°†ç»“果写回XML文档。
解决方案¶
使用 xml.etree.ElementTree 模��以很容易的处�这些任务。
ç¬¬ä¸€æ¥æ˜¯ä»¥é€šå¸¸çš„æ–¹å¼�æ�¥è§£æž�这个文档。例如,å�‡è®¾ä½ 有一个å��为 pred.xml 的文档,类似下é�¢è¿™æ ·ï¼š
<?xml version="1.0"?>
<stop>
<id>14791</id>
<nm>Clark & Balmoral</nm>
<sri>
<rt>22</rt>
<d>North Bound</d>
<dd>North Bound</dd>
</sri>
<cr>22</cr>
<pre>
<pt>5 MIN</pt>
<fd>Howard</fd>
<v>1378</v>
<rn>22</rn>
</pre>
<pre>
<pt>15 MIN</pt>
<fd>Howard</fd>
<v>1867</v>
<rn>22</rn>
</pre>
</stop>
下é�¢æ˜¯ä¸€ä¸ªåˆ©ç”¨ ElementTree æ�¥è¯»å�–这个文档并对它å�šä¸€äº›ä¿®æ”¹çš„例å�:
>>> from xml.etree.ElementTree import parse, Element
>>> doc = parse('pred.xml')
>>> root = doc.getroot()
>>> root
<Element 'stop' at 0x100770cb0>
>>> # Remove a few elements
>>> root.remove(root.find('sri'))
>>> root.remove(root.find('cr'))
>>> # Insert a new element after <nm>...</nm>
>>> root.getchildren().index(root.find('nm'))
1
>>> e = Element('spam')
>>> e.text = 'This is a test'
>>> root.insert(2, e)
>>> # Write back to a file
>>> doc.write('newpred.xml', xml_declaration=True)
>>>
处ç�†ç»“果是一个åƒ�下é�¢è¿™æ ·æ–°çš„XML文件:
<?xml version='1.0' encoding='us-ascii'?>
<stop>
<id>14791</id>
<nm>Clark & Balmoral</nm>
<spam>This is a test</spam>
<pre>
<pt>5 MIN</pt>
<fd>Howard</fd>
<v>1378</v>
<rn>22</rn>
</pre>
<pre>
<pt>15 MIN</pt>
<fd>Howard</fd>
<v>1867</v>
<rn>22</rn>
</pre>
</stop>
讨论¶
修改一个XMLæ–‡æ¡£ç»“æž„æ˜¯å¾ˆå®¹æ˜“çš„ï¼Œä½†æ˜¯ä½ å¿…é¡»ç‰¢è®°çš„æ˜¯æ‰€æœ‰çš„ä¿®æ”¹éƒ½æ˜¯é’ˆå¯¹çˆ¶èŠ‚ç‚¹å…ƒç´ ï¼Œ
将它作为一个列表æ�¥å¤„ç�†ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ åˆ é™¤æŸ�ä¸ªå…ƒç´ ï¼Œé€šè¿‡è°ƒç”¨çˆ¶èŠ‚ç‚¹çš„ remove() 方法从它的直接父节点ä¸åˆ 除。
å¦‚æžœä½ æ�’å…¥æˆ–å¢žåŠ æ–°çš„å…ƒç´ ï¼Œä½ å�Œæ ·ä½¿ç”¨çˆ¶èŠ‚ç‚¹å…ƒç´ çš„ insert() å’Œ append() 方法。
è¿˜èƒ½å¯¹å…ƒç´ ä½¿ç”¨ç´¢å¼•å’Œåˆ‡ç‰‡æ“�作,比如 element[i] 或 element[i:j]
å¦‚æžœä½ éœ€è¦�åˆ›å»ºæ–°çš„å…ƒç´ ï¼Œå�¯ä»¥ä½¿ç”¨æœ¬èŠ‚æ–¹æ¡ˆä¸æ¼”示的 Element 类。我们在6.5å°�节已ç»�详细讨论过了。