如何在Python3中包装元素?

时间:2013-02-02 05:40:07

标签: python xml lxml

有一个像这样的xml文件:

<body>
            <part>verb</part>
            love
            <meaning>
                <num>1.</num>
            </meaning>
             like
</body>

我喜欢在第一个孩子及其身体节点的尾部之后用<text>...</text>包裹内容。也就是说,

<body>
            <part>verb</part>
            love
            <text>    
                <meaning>
                    <num>1.</num>
                </meaning>
                like
            </text>
</body>

我试过这个,但接下来我不知道。

     import lxml.etree as ET
     xml = '''\    <body>
            <part>verb</part>
            love
            <meaning>
                <num>1.</num>
            </meaning>
             like
      </body>'''
      body = ET.fromstring(xml)  
      body.insert(2, text)

2 个答案:

答案 0 :(得分:0)

让我们从你得到的地方开始:

body = ET.fromstring(xml) 

现在我们需要找到元素meaning,您可以使用xPath或_Element.find,或者只使用硬编码索引,在本例中为BTW,它是1,而不是{ {1}}。我在这里使用2

find

现在我们制作meaning = find('meaning') 并将其添加为<text>的兄弟:

<meaning>

最后将text = body.makeelement('text') meaning.addprevious(text) 移至<meaning>

<text>

请注意,拖尾文本也会移动,text.append(meaning) 实际上会移动节点。

答案 1 :(得分:0)

from xml.etree import ElementTree as etree

xml = """<body>
           <part>verb</part>
           love
                <meaning>
                    <num>1.</num>
                </meaning>
                like
</body>"""

body = etree.fromstring(xml)
rest = body[1:] # all children after the first
del body[1:]
text_el = body.makeelement('text', {})
text_el.extend(rest)
body.append(text_el)
print(etree.tostring(body, encoding=str))

输出

<body>
            <part>verb</part>
            love
                <text><meaning>
                    <num>1.</num>
                </meaning>
                like
</text></body>