Удалить пространство имен из XML с комментарием - Python - PullRequest
1 голос
/ 02 марта 2020

Этот вопрос является продолжением этого ответа: { ссылка }

Я пытаюсь удалить пространство имен из файла XML. Связанный ответ отлично работает, если в XML нет комментариев. Однако, если есть комментарий, выдается ошибка.

Это пример моего кода:

from lxml import etree

input_xml = '''
<package xmlns="http://apple.com/itunes/importer">
  <provider>some data <!-- example comment--> </provider>
  <language>en-GB</language>
</package>
'''
root = etree.fromstring(input_xml)

# Remove namespace prefixes
for elem in root.getiterator():
    elem.tag = etree.QName(elem).localname
# Remove unused namespace declarations
etree.cleanup_namespaces(root)

print(etree.tostring(root).decode())

Выдает следующую ошибку:

ValueError: Неверный тег ввода типа class <'cython_function_or_method'>

РЕДАКТИРОВАТЬ:

Если у меня есть следующая структура "input_ xml", не все пространства имен убираются с использованием кода, приведенного в ответе ниже.

<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://com/scheme/location/example/ Location.xsd ">
  <provider>some data <!-- example comment--> </provider>
  <language>en-GB</language>
</package>

Результат кода по-прежнему:

<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://com/scheme/location/example/ Location.xsd ">
  <provider>some data <!-- example comment--> </provider>
  <language>en-GB</language>
</package>

1 Ответ

2 голосов
/ 02 марта 2020

Убедитесь, что узел не является комментарием, прежде чем изменять тег. Код ниже также удаляет любые атрибуты, которые находятся в пространстве имен.

for elem in root.getiterator():
    # For elements, replace qualified name with localname
    if not(type(elem) == etree._Comment):
        elem.tag = etree.QName(elem).localname

    # Remove attributes that are in a namespace
    for attr in elem.attrib:
        if "{" in attr:
            elem.attrib.pop(attr)
...