我目前正在尝试使用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) )


印刷品:

'    '

07-24 17:03