如何使用 yattag 库输出 CDATA

How to output CDATA using yattag library

我正在尝试使用以下代码生成包含标签 </documents>.

的 XML 文件
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 实体,但我做不到。

如何解决这个编码问题?

text 方法总是用 &lt; 替换“<”。如果您不想进行那种转义,您可以使用 asis 方法(它插入字符串 "as is")。但是,在您的情况下,使用 Yattag 的 cdata 方法会更合适。

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)