您好我正在使用的xml文件出现问题。现在发生的是每当我尝试获取msg标签时,我得到一个错误,阻止我访问数据。这是我到目前为止编写的代码。
from xml.dom import minidom
import smtplib
from email.mime.text import MIMEText
from datetime import datetime
def xml_data ():
f = open('C:\opidea_2.xml', 'r')
data = f.read()
f.close()
dom = minidom.parseString(data)
ic = (dom.getElementsByTagName('logentry'))
dom = None
content = ''
for num in ic:
xmlDate = num.getElementsByTagName('date')[0].firstChild.nodeValue
content += xmlDate + '\n '
xmlMsg = num.getElementsByTagName('msg')
if xmlMsg !='' and len(xmlMsg) > 0:
xmlMsgc = xmlMsg[0].firstChild.nodeValue
content += " Comments: \n " + str(xmlMsg) + '\n\n'
else:
xmlMsgc = "No comment made."
content += xmlMsgc
print content
if __name__ == "__main__":
xml_data ()
如果有帮助,这是xml的一部分。
<log>
<logentry
revision="33185">
<author>glv</author>
<date>2012-08-06T21:01:52.494219Z</date>
<paths>
<path
kind="file"
action="M">/branches/Patch_4_2_0_Branch/text.xml</path>
<path
kind="dir"
action="M">/branches/Patch_4_2_0_Branch</path>
</paths>
<msg>PATCH_BRANCH:N/A
BUG_NUMBER:N/A
FEATURE_AFFECTED:N/A
OVERVIEW:N/A
Adding the SVN log size requirement to the branch
</msg>
</logentry>
</log>
现在,当我使用xmlMsg = num.getElementsByTagName('msg')[0].toxml()
时,我可以让代码工作,我只需要做很多替换,而不是必须这样做。我也使用xmlDate = num.getElementsByTagName('date')[0].firstChild.nodeValue
约会。
我有什么遗漏或做错了吗?这里还有追溯。
Traceback (most recent call last):
File "C:\python\src\SVN_Email_copy.py", line 141, in <module>
xml_data ()
File "C:python\src\SVN_Email_copy.py", line 94, in xml_data
xmlMsg = num.getElementsByTagName('msg').firstChild.nodeValue
AttributeError: 'NodeList' object has no attribute 'firstChild'
答案 0 :(得分:4)
我建议采用不同的方法。下面是一个执行你想要的程序(我认为...... )。它使用ElementTree API而不是minidom。这简化了一些事情。
您已经发布了一些有关使用minidom解析XML文件的相关问题。我真的认为你应该研究ElementTree(对于更高级的东西,请查看ElementTree的“超集”,lxml)。这两个API比minidom更容易使用。
import xml.etree.ElementTree as ET
def xml_data():
root = ET.parse("opidea_2.xml")
logentries = root.findall("logentry")
content = ""
for logentry in logentries:
date = logentry.find("date").text
content += date + '\n '
msg = logentry.find("msg")
if msg is not None:
content += " Comments: \n " + msg.text + '\n\n'
else:
content += "No comment made."
print content
if __name__ == "__main__":
xml_data()
使用XML示例时的输出(您可能希望在确切的布局上更多地工作):
2012-08-06T21:01:52.494219Z
Comments:
PATCH_BRANCH:N/A
BUG_NUMBER:N/A
FEATURE_AFFECTED:N/A
OVERVIEW:N/A
Adding the SVN log size requirement to the branch
答案 1 :(得分:2)
myNodeList.item( 0)
答案 2 :(得分:2)
我似乎错误地执行了代码。以下是我能够解决的问题。
if len(xmlMsg) > 0 and xmlMsg[0].firstChild != None:
xmlMsgc = xmlMsg[0].firstChild.nodeValue
xmlMsgpbr = xmlMsgc.replace('\n', ' ')
xmlMsgf.append(xmlMsgpbr)
else:
xmlMsgf = "No comments made"
我从未检查过第一个孩子是否有任何价值。这就是我所缺少的。其他答案很有帮助,但这就是我能够让它发挥作用的方式。谢谢你们。
答案 3 :(得分:1)
使用此... print "%s" %(num.getElementsByTagName('date')[0].firstChild.data)