Как определить корневой xml-элемент использование Python и ElementTree


Я анализирую XML-файл, который, как я ожидаю, будет корневым элементом <data>. Однако некоторые пользователи изменили эти файлы и добавили элемент <?xml version="1.0" encoding="UTF-8"?> в верхней части. Я хочу проверить, существует ли это, а затем провалить тест, чтобы уведомить Пользователя об этой проблеме. Я попытался сделать следующее, Но он продолжает обнаруживать правильный корневой элемент <data>. Вот что у меня есть до сих пор.

<?xml version="1.0" encoding="UTF-8"?>
<data>
</data>

elementTree = self.param2
root = elementTree.find('.')

print root.tag

То, что я получаю, чтобы распечатать:

data 

(которая является не то, что я ожидал).

Любые идеи был бы признателен!

2 2

2 ответа:

Если вы используете правильный XML API, такой как xml.dom или ElementTree, у вас не должно быть никаких проблем с объявлением XML. Однако, если вы все еще настаиваете на удалении объявления, попробуйте сделать следующее:

from xml.dom import minidom

def remove_xml_declaration(xml_text):
    doc = minidom.parseString(xml_text)
    root = doc.documentElement
    xml_text_without_declaration = root.toxml(doc.encoding)
    return xml_text_without_declaration

#
# Test
#

xml_text = '''<?xml version="1.0" encoding="UTF-8"?>
<data>
</data>
'''

# Remove declaration
xml_text = remove_xml_declaration(xml_text)
print xml_text
print '---'

# Remove declaration, event if it is not there
xml_text = remove_xml_declaration(xml_text)
print xml_text
print '---'

Ну, я ценю все ответы. Однако я не хотел удалять его, я только хотел обнаружить его и заставить пользователя/разработчика удалить его. Вот что я сделал, чтобы обнаружить его.

import re

# The beginning of an XML Declaration to match.
xmlRegex = '(<\\?xml)'
rg = re.compile(xmlRegex, re.IGNORECASE | re.DOTALL)

lineCount = 0
with open("c:\file.xml") as f:
    for line in f:
        lineCount += 1
        match = rg.search(line)

        if match:
            self.assertTrue(False, logger.failed("An XML Declaration was detected on line: " + str(lineCount) + "."))
            else:
                pass