在python中解析XML文件以用于电子邮件目的

时间:2012-08-21 16:59:39

标签: python xml xml-parsing

我在python中编写代码,不仅可以读取xml,还可以将解析的结果作为电子邮件发送。现在我在尝试读取xml中的文件时遇到了麻烦。我做了一个简单的python脚本,我认为至少会读取该文件,然后我可以尝试在python中发送电子邮件,但我在第4行收到语法错误。

root.tag'log'

无论如何,这是我到目前为止编写的代码:

import xml.etree.cElementTree as etree

tree = etree.parse('C:/opidea.xml')
response = tree.getroot()
log = response.find('log').text
logentry = response.find('logentry').text
author = response.find('author').text
date = response.find('date').text
msg = [i.text for i in response.find('msg')]

现在xml文件具有这种格式化

  <log>
<logentry
   revision="12345">
<author>glv</author>
<date>2012-08-09T13:16:24.488462Z</date>
<paths>
<path
   action="M"
  kind="file">/trunk/build.xml</path>
</paths>
 <msg>BUG_NUMBER:N/A
FEATURE_AFFECTED:N/A
   OVERVIEW:Example</msg>
</logentry>
</log>

我希望能够发送此xml文件的电子邮件。现在虽然我只是想让python代码读取xml文件。

1 个答案:

答案 0 :(得分:1)

response.find('log')无法找到任何内容,因为:

  

find(self,path,namespaces = None)

     

按标签名称或路径查找第一个匹配的子元素。

在您的情况下,log不是子元素,而是根元素本身。但是,您可以直接获取其文本:response.text。但是在您的示例中,log元素无论如何都没有任何文本。

编辑:很抱歉,文档中的引用实际上适用于lxml.etree文档,而不是xml.etree

我不确定原因,但对find的所有其他来电也会返回None(您可以通过打印response.find('date')等找到它)。使用lxml,您可以使用xpath代替:

author = response.xpath('//author')[0].text
msg = [i.text for i in response.xpath('//msg')]

在任何情况下,findmsg的使用都不正确,因为find始终返回单个元素,而不是它们的列表。