Как произвести CDATA использование ElementTree

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

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

39
задан Natan 4 December 2012 в 01:07
поделиться

5 ответов

После небольшого количества работы я нашел ответ сам. Смотря на исходный код ElementTree.py, я нашел, что была специальная обработка XML-комментариев и предварительная обработка инструкций. То, что они делают, создают функцию фабрики для специального типа элемента, который использует специальное предложение (нестрока) значение тега для дифференциации ее от регулярных элементов.

def Comment(text=None):
    element = Element(Comment)
    element.text = text
    return element

Затем в _write функция ElementTree, который на самом деле производит XML, существует обработка особого случая для комментариев:

if tag is Comment:
    file.write("<!-- %s -->" % _escape_cdata(node.text, encoding))

для поддержки разделов CDATA, я создаю функцию фабрики, вызванную CDATA, расширил класс ElementTree и изменился эти _write функция для обработки элементов CDATA.

Это все еще не помогает, если Вы хотите проанализировать XML с разделами CDATA и затем произвести его снова с разделами CDATA, но он, по крайней мере, позволяет, Вы для создания XMLs с CDATA разделяете программно, который является тем, что я должен был сделать.

реализация, кажется, работает и с ElementTree и с cElementTree.

import elementtree.ElementTree as etree
#~ import cElementTree as etree

def CDATA(text=None):
    element = etree.Element(CDATA)
    element.text = text
    return element

class ElementTreeCDATA(etree.ElementTree):
    def _write(self, file, node, encoding, namespaces):
        if node.tag is CDATA:
            text = node.text.encode(encoding)
            file.write("\n<![CDATA[%s]]>\n" % text)
        else:
            etree.ElementTree._write(self, file, node, encoding, namespaces)

if __name__ == "__main__":
    import sys

    text = """
    <?xml version='1.0' encoding='utf-8'?>
    <text>
    This is just some sample text.
    </text>
    """

    e = etree.Element("data")
    cdata = CDATA(text)
    e.append(cdata)
    et = ElementTreeCDATA(e)
    et.write(sys.stdout, "utf-8")
27
ответ дан 27 November 2019 в 02:27
поделиться

lxml имеет поддержку CDATA и API как ElementTree.

17
ответ дан 27 November 2019 в 02:27
поделиться

На самом деле этот код имеет ошибку, так как Вы не ловите ]]> появление в данных, которые Вы вставляете, поскольку CDATA

согласно Является там способом выйти из маркера конца CDATA в xml?

необходимо повредить его в два CDATA's в этом случае, разделив ]]> между двумя.

в основном data = data.replace("]]>", "]]]]><![CDATA[>")
(не обязательно корректный, проверьте)

6
ответ дан 27 November 2019 в 02:27
поделиться

Это не возможный AFAIK..., который является жалостью. В основном модули ElementTree предполагают, что читателем является 100%-й совместимый XML, таким образом, не должно иметь значения, если они производят раздел как CDATA или некоторый другой формат, который генерирует эквивалентный текст.

Видят этот поток в списке рассылки Python для большего количества информации В основном, они рекомендуют некоторую основанную на DOM библиотеку XML вместо этого.

6
ответ дан 27 November 2019 в 02:27
поделиться

DOM имеет (по крайней мере на уровне 2) интерфейс DATASection и операционный Документ:: createCDATASection. Они - дополнительные интерфейсы, поддерживаемые только если поддержка внедрения "xml" функция.

от xml.dom импортируют minidom

my_xmldoc=minidom.parse (xmlfile)

my_xmldoc.createCDATASection (данные)

теперь, у Вас есть cadata узел, добавляет это везде, где Вы хотите....

1
ответ дан 27 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: