使用lxml设置元素内容会去除末尾空格
我现在正在尝试使用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) )
输出结果是:
' '