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;"

そうではありません。マッチングの一方の方向にはユニコードの解釈があると思われますが、もう一方の方向にはありません。これを解決する正しい方法は何ですか?

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の答えに基づいて構築すると、HTMLエンティティが属性としてオブジェクトET.fromstringに変換されます。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 に答える