gpt4 book ai didi

python - 使用 Python 的 elementtree 为带有文本的节点添加书尾

转载 作者:数据小太阳 更新时间:2023-10-29 02:34:50 25 4
gpt4 key购买 nike

我正在尝试将文本书挡添加到 XML 文件中的字符串。如果之前已经翻译过一个字符串,我想添加一个 @@@###到字符串的开头和结尾以进行进一步处理。最终结果如下所示:

<group>
<seg-source>
<mrk mid="1" mtype="seg">I have a <g id="157">red</g> pen.</mrk>
</seg-source>
<target>
<mrk mid="1" mtype="seg">@@@J'ai un stylo <g id="157">rouge</g>.###</mrk>
</target>
</group>

我在使用 xml.minidom 之前尝试过并创建了一个通用文本节点,例如 start_tag = xmldoc.createTextNode(u'@@@') ,并且能够将节点作为子节点插入/附加。 (出于各种原因,我最终放弃了使用 minidom。)

我能够从 minidom 转换我的脚本至 elementtree相当快,但我陷入了这个最关键的点。我已经阅读并重新阅读了文档,但我找不到任何特定于我需要做的事情,特别是因为很多 <mrk>元素有子元素,例如 <g>示例中的标记。此外,有时 <mrk> 中的第一件事节点可能不是文本元素,所以我无法替换文本。

Python 代码非常基础,如您所见,我有书挡的占位符。

for target in group.iter('target'):
for mrk in target.iter('mrk'):

# Adding "@@@" at front of <mrk>
mrk.insert(0, <magical text-only element here>)

# Adding "###" to end of <mrk>
mrk.append(<magical text-only element here>)

非常感谢!

最佳答案

ElementTree 以非常非 XML 的方式处理文本。这里涉及一些技巧。第一个是 <a>xxx<b>yyy</b>zzz<c>eee</c>rrr</a> ,你到达“zzz”的方式是通过tail<b>元素。 (我知道,XSLT 专家对此咬牙切齿。)

另一个技巧是您可以将 ET 元素视为子节点列表。所以你可以使用 len(root)获取它有多少个 child (忽略文本节点)。

这是一个快速示例程序,在我尝试时它似乎可以运行。您可能希望根据自己的需要对其进行调整,但它应该能让您继续前进。

import xml.etree.ElementTree as ET

xmlin="""
<group>
<mrk>I have a red pen.</mrk>
<mrk>I have a <g id="157">red</g> pen.</mrk>
<mrk><xyzzy>Hey!</xyzzy> I have a <g>red</g> pen.</mrk>
<mrk>There is text <and>this</and></mrk>
</group>
"""

root = ET.fromstring(xmlin)

for mrk in root:
if (mrk.text == None):
mrk.text = "@@@"
else:
mrk.text = "@@@" + mrk.text

# do we have children?
if (len(mrk) == 0):
mrk.text = mrk.text + "###"
else:
last = mrk[len(mrk)-1]
if (last.tail == None):
last.tail = "###"
else:
last.tail = last.tail + "###"

print('ET.tostring(root)')
print ET.tostring(root)

关于python - 使用 Python 的 elementtree 为带有文本的节点添加书尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28955516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com