1

我正在尝试根据属性的内容在 SVG(字体)文件中查找 XML 元素,如下所示:

font = et.ElementTree(file='fontfile.svg')
glyph = font.find('//n:glyph[@unicode="%s"]' % symbol, namespaces={'n': SVGNS})

字形示例——我试图匹配的——是:

<glyph unicode="&#xa9;" horiz-adv-x="1792" d="M834 ... -40t-121 -18z " />
<glyph unicode="C" horiz-adv-x="1509" d="M1766 338q-49 ... 83.5v-215z" />

问题是,例如,当

symbol = "C"

它工作正常(有一个匹配),但是当

symbol = "&#xa9;"

它没有。我怀疑在匹配的一个方向上存在 unicode 解释,但在另一个方向上没有。解决此问题的正确方法是什么?

4

2 回答 2

2

您可以使用 unicode 指定符号:symbol = u'\xa9'

import lxml.etree as ET

content = '''\
<root xmlns="SVGNS">
<glyph unicode="&#xa9;" horiz-adv-x="1792" d="M834 ... -40t-121 -18z " />
<glyph unicode="C" horiz-adv-x="1509" d="M1766 338q-49 ... 83.5v-215z" />
</root>'''

font = ET.fromstring(content)
symbol = u'\xa9'
for glyph in font.xpath(u'//n:glyph[@unicode="%s"]'%symbol,  namespaces={'n': 'SVGNS'}):
    print(ET.tostring(glyph))

产量

<glyph xmlns="SVGNS" unicode="&#xA9;" horiz-adv-x="1792" d="M834 ... -40t-121 -18z "/>
于 2013-01-19T19:56:41.670 回答
1

基于 unutbu 的回答,当你这样做时ET.fromstring,它会将 HTML 实体转换为unicode对象作为属性。

>>> import lxml.etree as ET
>>> 
>>> content = '''\
... <root xmlns="SVGNS">
... <glyph unicode="&#xa9;" horiz-adv-x="1792" d="M834 ... -40t-121 -18z " />
... <glyph unicode="C" horiz-adv-x="1509" d="M1766 338q-49 ... 83.5v-215z" />
... </root>'''
>>> font = ET.fromstring(content)
>>> font
<Element {SVGNS}root at 0x7fd7ab978410>
>>> font.xpath('//n:glyph', namespaces={'n':'SVGNS'})[0].attrib
{'horiz-adv-x': '1792', 'unicode': u'\xa9', 'd': 'M834 ... -40t-121 -18z '}

因此,最终的答案是 HTML 实体&#xa9;不再存在于 中font,要搜索它需要将其转换为 unicode。这里解释了一些方法来做到这一点

于 2013-01-19T22:02:23.913 回答