簡體   English   中英

使用Python的elementtree為帶有文本的節點進行Bookending

[英]Bookending a node with text with Python's elementtree

我正在嘗試將文本書擋添加到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”的方式是通過<b>元素的tail (我知道,XSLT專家們正在咬牙切齒。)

另一個使用的技巧是,您可以將ET元素視為子節點列表。 因此,您可以使用len(root)來獲取它擁有的子節點數(忽略文本節點)。

這是一個快速的示例程序,似乎在我嘗試時運行。 您可能希望根據自己的需要調整它,但它應該讓您前進。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM