[英]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.