【问题标题】:How to output CDATA using yattag library如何使用 yattag 库输出 CDATA
【发布时间】:2020-02-17 14:28:40
【问题描述】:

我正在尝试使用以下代码生成包含标签</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 实体,但我做不到。

如何解决这个编码问题?

【问题讨论】:

    标签: python xml encoding yattag


    【解决方案1】:

    text 方法始终将“&lt;。如果您不想进行这种转义,则可以改用asis 方法(它“按原样”插入字符串)。但是,在您的情况下,使用 Yattag 的 cdata 方法会更合适。

    from yattag import Doc
    help(Doc.cdata)
    

    cdata(self, strg, safe=False) 附加一个包含所提供字符串的 CDATA 部分。

    您不必担心可能会终止的]]&gt; 序列 CDATA 部分。它们被替换为]]]]&gt;&lt;![CDATA[&gt;

    如果您确定您的字符串不包含]]&gt;,您可以传递safe = True。 如果你这样做,你的字符串将不会被搜索]]&gt; 序列。

    所以,在你的情况下,你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2010-09-15
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多