Как определить корневой 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 ответа:
Если вы используете правильный 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