【问题标题】:Replacing XML entity (&amp; &lt; &gt; &nbsp;) with a placeholder用占位符替换 XML 实体 (& < > )
【发布时间】:2020-05-20 21:42:06
【问题描述】:

我有一个这样的 XML 文件;

<Table>
<Row>
    <Cell>text id</Cell>
    <Cell>First Text&lt;br/&gt;&amp;nbsp;&lt;br/&gt;</Cell>
    <Cell>Second Text&lt;br/&gt;&amp;nbsp;&lt;br/&gt;</Cell>
</Row>
.
.
</Table>

通过使用这些代码,我将&lt;Cell&gt;&lt;/Cell&gt; 中的每个文本都发送到一个列表变量。

tree = ET.parse(file_path)
root = tree.getroot()
list = []
for row in root.iter(tag='Row'):
    for cell in row:
        list.append(cell.text)

问题是First Text&amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;lt;br/&amp;gt;变成First Text&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

我想用我自己分配的占位符替换这些实体字符,因为我必须稍后在我的程序中将它们替换为原始形式。例如;

special character -> [placeholder] &lt;br/&gt; -> [br/] &amp; -> [amp] &nbsp; -> [nbsp]

【问题讨论】:

  • 你能解释一下你这样做的原因吗?在大多数情况下,这种诡计是不必要的——它源于对如何处理 XML 数据的误解。
  • 我正在做游戏翻译,我正在将这些文本发送到谷歌翻译。 Google Translate API 在遇到这些实体字符时会失败。为了正确翻译,我必须删除/替换这些实体字符,翻译后我必须将它们放回去。当我收集要列出的文本时,这些实体字符会像 <变成
  • 不熟悉 Google Translate API - 它以什么形式返回翻译后的文本?列表?字典?
  • 因此,您希望在调用 XML 解析器之前 进行字符串替换,这样就不会发生字符实体替换,并且您可以恢复准确的原始文本。那么...您尝试过什么:文本替换?如果您发布该代码,我们或许能够发现问题。

标签: python python-3.x xml xml-parsing


【解决方案1】:

我找到了办法。在 XML 解析之前,我使用 readlines() 读取每一行,然后在新的 xml 文件中的该写入行之后用占位符替换实体字符。翻译后,我可以使用 replace() 将它们替换为原始形式。

First Text&amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;lt;br/&amp;gt; => First Text[H1][H4][H6][H1]

with open(r"C:\Users\USER NAME\PycharmProjects\FILE TEST\edited_file.xml", "w", encoding="utf-8") as file2:
    pass

with open(r"C:\Users\USER NAME\PycharmProjects\FILE TEST\source_file.xml", "r", encoding="utf-8") as file1:
    lines = file1.readlines()
    text = ""
    for i in lines:
        text = i
        text = text.replace('&lt;br/&gt;', '[H1]')
        text = text.replace('&lt;', '[H2]')
        text = text.replace("&gt;", "[H3]")
        text = text.replace("&amp;", "[H4]")
        text = text.replace("&nbsp;", "[H5]")
        text = text.replace("nbsp;", "[H6]")
        with open(r"C:\Users\USER NAME\PycharmProjects\FILE TEST\edited_file.xml", "a", encoding="utf-8") as file2:
            file2.writelines(text)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 2013-01-24
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多