我目前正在尝试使用lxml library创建svg图像。但是,我创建了一些tspace元素来构造和格式化文本元素中的文本,但是如果我尝试将这样的tspace元素的内容设置为类似&#34; Hello World&#34;,则删除尾部空格并且我得到<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>
。
答案 0 :(得分:1)
您可能正在寻找lxml.tree
库中的tail
property of XML elements。以下是文档对此的说法:
但是,如果XML用于标记文本文档,例如(X)HTML,则文本也可以出现在树的中间的不同元素之间:
<html><body>Hello<br/>World</body></html>
此处,
<br/>
标记被文字包围。这通常被称为文档样式或混合内容XML。 Elements通过tail
属性支持此功能。它包含直接跟在元素后面的文本,直到XML树中的下一个元素:
在您的情况下,tail
的内容是空格。这是一个例子:
import lxml.etree as ET
x = ET.fromstring("<foo> <bar>blah</bar> </foo>")
bar = x.find("bar")
print( repr(bar.tail) )
打印:
' '