我正在努力研究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文件?
答案 0 :(得分:4)
您的代码看起来不正确。在childNode
作业中,childNodes
时NAME
为<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