Это поведение в прошлом называлось ошибкой и решалось как «не исправить».
Автор модуля ElementTree прокомментировал
Для ET [такое поведение] сделано намеренно. Проверка данных, предоставляемых каждым отдельным приложением, снизит производительность для всех из них, даже если лишь небольшое меньшинство когда-либо попытается сериализовать данные, которые не могут быть представлены в XML.
Закрытие комментарий (от сопровождающего l xml, который также является разработчиком ядра Python) включает следующие наблюдения:
Это непростое решение. l xml, например, проверяет вводимые пользователем данные, но это потому, что он все равно должен его обрабатывать и делает это по ходу непосредственно при вводе (и очень эффективно в коде C). ET, с другой стороны, довольно снисходительно относится к тому, что он позволяет пользователям делать, и не применяет много обработки к пользовательскому вводу. Он даже допускает недопустимые деревья во время обработки и ожидает, что дерево будет сериализовано только при запросе на сериализацию.
Я думаю, что это справедливое поведение, потому что большая часть пользовательского ввода будет в порядке и не должна страдать от производительности штраф за проверку всего ввода. Например, нулевые символы очень редко встречаются в тексте, и я думаю, что разумно позволить пользователям обрабатывать несколько случаев самостоятельно, где они могут возникнуть.
...
В конце концов, пользователи, которые действительно заботятся о правильном выводе, должны выполнить какую-то проверку схемы над ним после сериализации, поскольку это обнаружит не только проблемы с данными, но также структурные и логические проблемы ( например, отсутствующий или пустой атрибут), особенно для их целевого формата данных. В некоторых случаях он может даже обнаружить случайное повреждение данных из-за старой не-E CC RAM на сервере. :)
...
Таким образом, ET.tostring
будет генерировать xml, который не является правильно сформированным, и это сделано намеренно. При необходимости вывод можно проанализировать, чтобы проверить правильность его формата, используя ET.fromstring
или другой синтаксический анализатор. В качестве альтернативы вместо ElementTree можно использовать l xml.