Как вывести CDATA с помощью библиотеки yattag - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь с помощью следующего кода создать файл XML, содержащий теги </documents>.

string = "dasdd Wonder asdf new single, “Tomorrow” #URL# | " \
    "oiojk asfddsf releases new asdfdf, “gfsg” | " \
    "Identity of asfqw who dasd off asdfsdf Mainland jtyjyjui revealed #URL#"

from yattag import Doc, indent
import html, re

doc, tag, text = Doc().tagtext()
with tag('author', lang='en'):
    with tag('documents'):
        for tweet in string.split(' | '):
            with tag('document'):
                tweet = html.unescape(tweet)
                text('<![CDATA[{}]]'.format(tweet))
result = indent(doc.getvalue(), indentation=' ' * 4, newline='\n')
with open('test.xml', 'w', encoding='utf-8') as f:
    f.write(result)

Я хотел добавить токен CDATA вокруг текста, но когда я открываю сгенерированный файл с использованием Notepad++ вместо вывода в виде:

<document><![CDATA[oiojk asfddsf releases new asdfdf, “gfsg”]]></document>

выглядит так (с HTML сущностями):

<document>&lt;![CDATA[oiojk asfddsf releases new asdfdf, “gfsg”]]</document>

Я пытался использовать библиотеку HTML (html.unescape строка), чтобы удалить HTML сущностей, но я не смог.

Как я могу решить эту проблему кодирования?

1 Ответ

1 голос
/ 17 февраля 2020

Метод text всегда заменяет '<' на <code>&lt;. Если вы не хотите экранирования такого рода, вы должны использовать вместо этого метод asis (он вставляет строку «как есть»). Но в вашем случае было бы более целесообразно использовать метод cdata Yattag.

from yattag import Doc
help(Doc.cdata)

cdata (self, strg, safe = False) добавляет раздел CDATA, содержащий предоставленную строку.

Вам не нужно беспокоиться о возможных ]]> последовательностях, которые могли бы завершить раздел CDATA. Они заменяются на ]]]]><![CDATA[>.

Если вы уверены, что ваша строка не содержит ]]>, вы можете передать safe = True. Если вы сделаете это, ваша строка не будет искать ]]> последовательностей.

Итак, в вашем случае вы можете сделать:

for tweet in string.split(' | '):
    with tag('document'):
        tweet = html.unescape(tweet)
        doc.cdata(tweet)
...