我目前正在尝试使用lxml library创建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>
。 最佳答案
您可能正在tail
库中寻找lxml.tree
property of XML elements。这是文档对此的评价:
但是,如果将XML用于标记的文本文档(如(X)HTML),则文本也可能出现在树中间的不同元素之间:
<html><body>Hello<br/>World</body></html>
在这里,<br/>
标记被文本包围。这通常称为文档样式或混合内容XML。元素通过其tail
属性支持此功能。它包含直接在元素之后的文本,直到XML树中的下一个元素:
在您的情况下,tail
的内容是空格。这是一个例子:
import lxml.etree as ET
x = ET.fromstring("<foo> <bar>blah</bar> </foo>")
bar = x.find("bar")
print( repr(bar.tail) )
印刷品:
' '