Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
После небольшого количества работы я нашел ответ сам. Смотря на исходный код 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")
На самом деле этот код имеет ошибку, так как Вы не ловите ]]>
появление в данных, которые Вы вставляете, поскольку CDATA
согласно Является там способом выйти из маркера конца CDATA в xml?
необходимо повредить его в два CDATA's в этом случае, разделив ]]>
между двумя.
в основном data = data.replace("]]>", "]]]]><![CDATA[>")
(не обязательно корректный, проверьте)
Это не возможный AFAIK..., который является жалостью. В основном модули ElementTree предполагают, что читателем является 100%-й совместимый XML, таким образом, не должно иметь значения, если они производят раздел как CDATA или некоторый другой формат, который генерирует эквивалентный текст.
Видят этот поток в списке рассылки Python для большего количества информации В основном, они рекомендуют некоторую основанную на DOM библиотеку XML вместо этого.
DOM имеет (по крайней мере на уровне 2) интерфейс DATASection и операционный Документ:: createCDATASection. Они - дополнительные интерфейсы, поддерживаемые только если поддержка внедрения "xml" функция.
от xml.dom импортируют minidom
my_xmldoc=minidom.parse (xmlfile)
my_xmldoc.createCDATASection (данные)
теперь, у Вас есть cadata узел, добавляет это везде, где Вы хотите....