l xml может заменить любой элемент другим элементом, включая комментарий, но, к сожалению, если вы создаете текст этого комментария из существующего элемента, l xml снова копирует пространство имен по умолчанию в текст комментария.
Поэтому вместо l xml я решил использовать BeautifulSoup , который обрабатывает пространства имен более "мягко".
Попробуйте следующий код:
from bs4 import BeautifulSoup, Comment
soup = BeautifulSoup(open('Input.xml'), 'xml')
for elem in soup.findAll('list'):
elem.replace_with(Comment(str(elem)))
print(soup.prettify())
Для вашего ввода XML, немного укоротив, я получил:
<?xml version="1.0" encoding="utf-8"?>
<raml version="0.1" xmlns="abcd.xsd">
<newData type="hw">
<header>
<log action="create" dateTime="2020-01-15T16:45:12.001Z"/>
</header>
<sampleObject class="com.abcd.efgh:VASDF" distName="some_unique_name" operation="update" version="HDGEKB_8363_845">
<p name="p_name1">true</p>
<!--<list name="list_name1">
<item>
<p name="address1">some/address-1</p>
<p name="value">1</p>
</item>
<item>
<p name="address1">some/address-2</p>
<p name="value">2</p>
</item>
</list>-->
<!--<list name="list_name2">
<item>
<p name="address1">some/address-3</p>
<p name="value">3</p>
</item>
<item>
<p name="address1">some/address-4</p>
<p name="value">4</p>
</item>
</list>-->
</sampleObject>
</newData>
</raml>
Редактировать
Если вы хотите закомментировать только один элемент list (например, с атрибутом name , равным 'list_name1'), исправление будет простым:
findAll * У 1028 * есть другой параметр, а именно attrs (словарь), где вы можете передавать любые имена / значения атрибутов, чтобы сузить выбор.
В этом случае измените l oop на :
for elem in soup.findAll('list', attrs={'name': 'list_name1'}):
elem.replace_with(Comment(str(elem)))
Чтобы удалить только выбранные элементы, имя метода для его выполнения менее интуитивно, а именно: . .
. Для этого выполните:
for elem in soup.findAll('list', attrs={'name': 'list_name1'}):
elem.decompose()
Редактируйте после комментария о XML префикс
Один рецепт для удаления Префикс XML должен вызывать BeautifulSoup без второго xml аргумента.
Но затем элемент root в выводе это html, содержащий внутри body элемент и raml элемент внутри него.
Таким образом, чтобы отбросить эти 2 "внешних" элемента, измените код на:
soup = BeautifulSoup(open('Input.xml'))
for elem in soup.findAll('list'):
elem.replace_with(Comment(str(elem)))
print(soup.html.body.raml.prettify())
Также, например, элемент <p>
хранится в одной строке .
Немного «грязное» решение, но, надеюсь, приведет к ожидаемый результат.