Read XML file which has xmlns in tag with python

python, xml, xml-namespaces

Solution

try using `xml.etree.ElementTree.register_namespace(prefix, uri)`

So

xml.etree.ElementTree.register_namespace("lc", "http://schemas.com/labcore/configuration")

Then when you're searching for elements, use the prefix before the element name

loggingTag = rootElement.find("lc:labcore.logging.service")

Problem

I am trying to read a element form a xml file to add new elements. The tag I'm trying to find contains xmlns. It looks like this: ``` <labcore.logging.service defaultSystemIdentificationCode="??" xmlns="http://schemas.com/labcore/configuration"> <storage databaseName="COMIT" storageType="Oracle" /> <logEventDefinitions> <logEventDefinition assembly="IM.LogEventDefinitions" /> <logEventDefinition assembly="BarcodeEntry.LogEventDefinitions" /> <logEventDefinition assembly="MaintenanceScheduling.ActivityLog.Messages.LogEventDefinitions" /> <logEventDefinition assembly="InCore.LogEventDefinitions" /> <logEventDefinition assembly="LogEventPackage.LogEventDefinitions" /> </logEventDefinitions> ``` and my python code looks like this: ``` import xml.etree.ElementTree as xml def modifyComitLoggingConfigFile(filePath, fileName): path = filePath+"\\"+fileName IM = xml.Element("logEventDefinition") IM.attrib["assembly"] = "IM.LogEventDefinitions" BarcodeEntry = xml.Element("logEventDefinition") BarcodeEntry.attrib["assembly"] = "BarcodeEntry.LogEventDefinitions" MaintenanceScheduling = xml.Element("logEventDefinition") MaintenanceScheduling.attrib["assembly"] = "MaintenanceScheduling.ActivityLog.Messages.LogEventDefinitions" RTCosmo3 = xml.Element("logEventDefinition") RTCosmo3.attrib["assembly"] = "InCore.LogEventDefinitions" tree = xml.parse(path) rootElement = tree.getroot() loggingTag = rootElement.find("labcore.logging.service") print "loggingTag" print loggingTag print logEventDefinitionsTag = loggingTag.find("logEventDefinitions") print "logEventDefinitionsTag" print logEventDefinitionsTag print logEventDefinitionsTag.insert(0, RTCosmo3) logEventDefinitionsTag.insert(0, MaintenanceScheduling) logEventDefinitionsTag.insert(0, BarcodeEntry) logEventDefinitionsTag.insert(0, IM) print "definitionfilesTag" print logEventDefinitionsTag print print "xml.tostring of definitionfilesTag" print xml.tostringlist(logEventDefinitionsTag) print tree.write(path+"1") return ``` and at the following line: ``` import xml.etree.ElementTree as xml def modifyComitLoggingConfigFile(filePath, fileName): path = filePath+"\\"+fileName IM = xml.Element("logEventDefinition") IM.attrib["assembly"] = "IM.LogEventDefinitions" BarcodeEntry = xml.Element("logEventDefinition") BarcodeEntry.attrib["assembly"] = "BarcodeEntry.LogEventDefinitions" MaintenanceScheduling = xml.Element("logEventDefinition") MaintenanceScheduling.attrib["assembly"] = "MaintenanceScheduling.ActivityLog.Messages.LogEventDefinitions" RTCosmo3 = xml.Element("logEventDefinition") RTCosmo3.attrib["assembly"] = "InCore.LogEventDefinitions" tree = xml.parse(path) rootElement = tree.getroot() loggingTag = rootElement.find("labcore.logging.service") print "loggingTag" print loggingTag print logEventDefinitionsTag = loggingTag.find("logEventDefinitions") print "logEventDefinitionsTag" print logEventDefinitionsTag print logEventDefinitionsTag.insert(0, RTCosmo3) logEventDefinitionsTag.insert(0, MaintenanceScheduling) logEventDefinitionsTag.insert(0, BarcodeEntry) logEventDefinitionsTag.insert(0, IM) print "definitionfilesTag" print logEventDefinitionsTag print print "xml.tostring of definitionfilesTag" print xml.tostringlist(logEventDefinitionsTag) print tree.write(path+"1") return ``` and on the following line: ``` loggingTag = rootElement.find("labcore.logging.service") ``` the following error occurs: ``` AttributeError: 'NoneType' object has no attribute 'find' ``` but when i remove the `xmlns` part from the tag, it works. does anybody know how i can solve this?

Original source