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

标签 python xml elementtree minidom

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

相关文章:

python - XML 解析问题,某些孟加拉语字符在 Python ElementTree 中显示 ParseError

python - 插入 DataFrame 列并根据 PySpark 或 Pandas 中的另一列进行排序

python - 在 channel 上重复一个数组

html - 常规 : parsing xml with HTML tags inside

python - Unicode解码错误: 'utf8' codec can't decode bytes

python - 在属性 ID 相同的地方合并 XML 文件 Python

python - 多个 scikit 学习管道的奇怪行为

php - 是否有 Python 的 RedBeanPHP 等效项?

c# - 以缩进格式将 xml 字符串或 XmlNode 保存到文本文件?

java - 优化 DOM 和 XPath Java 代码