我正在尝试将文本书挡添加到 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/