且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

pythony读取xml

更新时间:2022-10-02 13:17:41

xml样例:


  1. <?xml version="1.0"?> 
  2. <config> 
  3.         <backupdir id="100">/backup/</backupdir> 
  4.         <dbbackup id="1"> 
  5.                 <host>192.168.1.100</host> 
  6.                 <user>root</user> 
  7.                 <passwd>123456</passwd> 
  8.                 <dbname>lhp</dbname> 
  9.         </dbbackup> 
  10.         <dbbackup id="2"> 
  11.                 <host>192.168.1.101</host> 
  12.                 <user>root</user> 
  13.                 <passwd>123456</passwd> 
  14.                 <dbname>lhp_s2</dbname> 
  15.         </dbbackup> 
  16.         <webbackup id="1"> 
  17.                 <dir>/data/www</dir> 
  18.         </webbackup> 
  19. </config> 

首先导入模块,我使用的是minidom:


  1. from xml.dom import minidom 

然后加载xml文件:


  1. dom = minidom.parse('backup.xml'

现在我想读取<backupdir id="100">/backup/</backupdir>这一个元素中的ID的值和这一个元素的值

首先要找到这个元素,使用getElementsByTagName() 可以找到xml中某个元素:

 >>> dom.getElementsByTagName('backupdir')
[<DOM Element: backupdir at 0x2c7da88>]

这里返回的是一上列表,所以我们要指定第一个值:

 >>> dom.getElementsByTagName('backupdir')[0]
<DOM Element: backupdir at 0x2c7da88>

得到这个值我们就可以获取id:

>>> dom.getElementsByTagName('dbbackup')[0].getAttribute('id')
u'1'

然后我们看看bakupdir元素下面的节点有什么:

 >>> dom.getElementsByTagName('backupdir')[0].childNodes
[<DOM Text node "/backup/">]

和dbbackup对比一下:

 >>> dom.getElementsByTagName('dbbackup')[0].childNodes
[<DOM Text node "
    ">, <DOM Element: host at 0x2c7dd08>, <DOM Text node "
    ">, <DOM Element: user at 0x2c7de08>, <DOM Text node "
    ">, <DOM Element: passwd at 0x2c7df08>, <DOM Text node "
    ">, <DOM Element: dbname at 0x2c82048>, <DOM Text node "
  ">]

xml中换行也是一个内容,如果元素像backupdir那样,想获取值就很简单:

 >>> dom.getElementsByTagName('backupdir')[0].childNodes[0].data
u'/backup/'

如果要获取嵌套的元素内容就要使用循环,把空格排除就可以了,排除空格使用nodeType属性可以做到

nodeType是结点的类型,现在有以下几种:

'ATTRIBUTE_NODE'
'CDATA_SECTION_NODE'
'COMMENT_NODE'
'DOCUMENT_FRAGMENT_NODE'
'DOCUMENT_NODE'
'DOCUMENT_TYPE_NODE'
'ELEMENT_NODE'
'ENTITY_NODE'
'ENTITY_REFERENCE_NODE'
'NOTATION_NODE'
'PROCESSING_INSTRUCTION_NODE'
'TEXT_NODE'

用这条判断式就可以dom.getElementsByTagName('dbbackup')[0].nodeType == dom.getElementsByTagName('dbbackup')[0].ELEMENT_NODE

剩下的东西就跟上面说的是一样的了

本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/890287如需转载请自行联系原作者


lihuipeng