使用lxml设置元素内容会去除末尾空格

1 投票
1 回答
1115 浏览
提问于 2025-04-20 18:43

我现在正在尝试使用lxml库创建一个svg图像。不过,我创建了一些tspace元素来组织和格式化文本,但当我试图将这样的tspace元素的内容设置为“Hello World ”时,末尾的空格会被去掉,结果变成了<tspace>Hello World</tspace>。但我希望能保留这个空格。

在这里需要提到的是,我只能访问Tree对象,但我并没有初始化解析器。所以如果我需要更改一些解析器的设置,我就无法直接访问解析器。以下是我代码的一个小示例:

#!/usr/bin/env python
import sys, os

class HelloPlugin(inkex.Effect):
    def __init__(self):
        # Call the base class constructor.
        inkex.Effect.__init__(self)

    def effect(self):
        # Fetch the svg root element (lxml etree element) ...
        svg = self.document.getroot()

        # ... as well as the image width and height.
        width  = inkex.unittouu(svg.get('width'))
        height = inkex.unittouu(svg.get('height'))
        fontSize = 12

        # Create a new layer.
        layer = inkex.etree.SubElement(svg, 'g')
        layer.set(inkex.addNS('label', 'inkscape'), 'Headline Layer')
        layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')

        # Create the text element, ...
        text = inkex.etree.SubElement(layer, inkex.addNS('text','svg'))
        text.set('x', str(width / 2 + fontSize))
        text.set('y', str(height / 2 + fontSize / 2))

        # ... define text style and position ...
        style = {
            'font-size': str(fontSize)
        }

        # ... and set the text style.
        text.set('style', formatStyle(style))

        # Finally create the tspan element.
        tspan = inkex.etree.SubElement(text, inkex.addNS('tspan','svg'))
        tspan.text = "Hello Plugin "

def main(argv):
    cubify = Cubify()
    cubify.affect()

if __name__ == "__main__":
    main(sys.argv[1:])

所以我的问题是,我该如何修改上面的示例,以便在生成的svg文件中得到<tspace>Hello Plugin </tspace>而不是<tspace>Hello plugin</tspace>

1 个回答

1

你可能在寻找 tail 属性,这是在 lxml.tree 库中的一个功能。文档里是这么说的:

不过,如果XML用于带标签的文本文件,比如 (X)HTML,文本也可以出现在不同元素之间,也就是在树的中间部分:

<html><body>你好<br/>世界</body></html>

在这里,<br/> 标签周围有文本。这种情况通常被称为文档风格或混合内容的XML。元素通过它们的 tail 属性来支持这种情况。这个属性包含了紧跟在元素后面的文本,直到下一个元素出现为止:

在你的例子中,tail 的内容是空格。下面是一个示例:

import lxml.etree as ET
x = ET.fromstring("<foo> <bar>blah</bar>    </foo>")
bar = x.find("bar")
print( repr(bar.tail) )

输出结果是:

'    '

撰写回答