使用lxml设置元素内容会删除尾随空格

时间:2014-09-10 00:30:20

标签: python xml svg lxml inkscape

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

1 个答案:

答案 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) )

打印:

'    '