Python , XML AttributeError: 'NodeList' objet n'a pas d'attribut "firstChild'
Bonjour, je vais avoir des ennuis avec un fichier xml que j'utilise. Maintenant ce qui se passe est à chaque fois que j'essaie d'obtenir de l'étiquette msg j'obtiens un message d'erreur m'empêche d'avoir accès aux données. Voici le code que j'ai écris jusqu'à présent.
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 ()
Voici une partie de la xml si ça aide.
<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>
Maintenant quand j'utilise xmlMsg = num.getElementsByTagName('msg')[0].toxml()
je peux obtenir le code fonctionne, j'ai juste à faire beaucoup de réinstallation et je préfère ne pas avoir à le faire. J'ai aussi jour de travail à l'aide de xmlDate = num.getElementsByTagName('date')[0].firstChild.nodeValue
.
Est-il quelque chose que je suis absent ou mal? Aussi, voici le traceback.
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'
Vous devriez format de code de tout ce qui n'est pas du texte, y compris un retraçage.
OriginalL'auteur Gilbert V | 2012-08-29
Vous devez vous connecter pour publier un commentaire.
Je suggère une approche différente. Ci-dessous est un programme qui fait ce que vous voulez (je pense...). Il utilise le ElementTree API au lieu de minidom. Cela simplifie les choses un peu.
Vous avez posté plusieurs questions concernant l'analyse d'un fichier XML à l'aide de minidom. Je pense vraiment que vous devriez regarder dans ElementTree (et même pour des choses plus avancées, découvrez ElementTree du "sur-ensemble", lxml). Ces deux Api sont beaucoup plus faciles à travailler que minidom.
De sortie lors de l'utilisation de votre exemple XML (vous pouvez la faire travailler un peu plus sur la mise en page exacte):
OriginalL'auteur mzjn
peut-être...
http://docs.python.org/library/xml.dom.html
hmmm je sais pas, Il doit être un attribut XML NodeList ... donc ce qui arrive si vous venez de le faire firstChild ? pas le nodevalue partie?
xmlMsg = num.getElementsByTagName('msg')[0].firstChild Bien quand je le fais je fais la <DOM nœud de Texte "u'PATCH_BRAN'..."> mais c'est à peu près ça. Pas quelque chose de vraiment lire-mesure en elle. Je ne suis pas sûr pourquoi, la nodeValue ne fonctionne pas avec cette.
J'ai remarqué quelque chose sur un petit fichier journal xml, il travaillera avec l' .firstChild.nodeValue , mais pour une plus longue file il ne. Maintenant, j'ai édité le code et ajout d'un len vérificateur assurez-vous qu'il y a un commentaire, mais vous ne savez pas si cela va fonctionner. L'erreur que j'ai eu ne semble pas liée à ce type d'erreur.
éventuellement xml mal formé?
OriginalL'auteur Joran Beasley
Je faisais le code de mal il me semble. Voici comment j'ai été capable de le résoudre.
Je n'ai jamais vérifié si votre premier enfant a eu une valeur ou non. C'est ce qui me manquait. les autres réponses ont aidé à bien, mais c'est la façon dont j'ai été capable de le faire fonctionner. Merci les gars.
OriginalL'auteur Gilbert V
utiliser ce...
print "%s" %(num.getElementsByTagName('date')[0].firstChild.data)
OriginalL'auteur bimlesh sharma