Python XML Minidom在子节点中按标记获取元素

时间:2013-06-30 12:03:06

标签: python xml minidom

我正在努力研究IRC Bot,并希望从XML文件中检索配置,如下所示:

<server>
  <host> HOST1 </host>
  <port> 6667 </port>
  <channel>
    <name> CHANNAME1</name>
  </channel>
  <channel>
    <name> CHANNAME2 </name>
  </channel>
</server>
<server>
  <host> HOST2 </host>
  <port> 6667 </port>
  <channel>
    <name> CHANNAME3 </name>
  </channel>
</server>

我的代码看起来像这样:

doc = minidom.parse(xml)
node = doc.documentElement
servers = doc.getElementsByTagName("server")

for server in servers:

    channels = server.getElementsByTagName("channel")
    host = server.getElementsByTagName("host")[0].childNodes[0].data
    print host

    for channel in channels:
        NAME = channel.getElementsByTagName("name")[0].childNode[0].data
        print NAME

输出

HOST1
CHANNAME1
CHANNAME2
CHANNAME3
HOST2
CHANNAME1
CHANNAME2
CHANNAME3

但我需要的只是

HOST1
CHANNAME1
CHANNAME2
HOST2
CHANNAME3

有没有办法在我的节点服务器中获取标签名称为“channel”的所有元素,而不是整个xml文件?

2 个答案:

答案 0 :(得分:4)

您的代码看起来不正确。在childNode作业中,childNodesNAME<servers> <server> <host> HOST1 </host> <port> 6667 </port> <channel> <name> CHANNAME1</name> </channel> <channel> <name> CHANNAME2 </name> </channel> </server> <server> <host> HOST2 </host> <port> 6667 </port> <channel> <name> CHANNAME3 </name> </channel> </server> </servers> ,但我认为这只是您提问中的错字。

但您的XML无效。您需要使用某种根节点包装服务器。正如它目前所写,我不希望甚至成功解析。看起来应该是这样的:

{{1}}

使用该XML以及您提供的代码,我得到您期望的确切输出。

答案 1 :(得分:3)

不要使用迷你芯片。请改用ElementTree API。它可以更好地处理子树搜索:

from xml.etree import ElementTree as ET

doc = ET.parse(xmlfile).getroot()

for server in doc.findall('server'):
    host = server.find('./host').text
    print host
    for channel in server.findall('channel'):
        name = channel.find('name').text
        print name