Python 为什么当我在font.iter(';glyph';)中运行“for glyph”时,etree从SVG中不返回任何内容? 目标

Python 为什么当我在font.iter(';glyph';)中运行“for glyph”时,etree从SVG中不返回任何内容? 目标,python,python-3.x,svg,lxml,elementtree,Python,Python 3.x,Svg,Lxml,Elementtree,我对Python还很陌生。我想我应该尝试编写一个脚本,使用etree从SVG图标文件中检索glyph name和unicode,从而从中创建一个更少的文件 蛮力解 我编写了一个解决方案,迭代SVG元素以获得元素属性,将它们放入一个列表中,然后从列表中的属性编写我的LESS样式。它看起来像这样: SVG结构 FontForge 20170731于2019年3月13日星期三07:05:16由root创建 从lxml导入etree filename=“font.svg” tree=etree.pa

我对Python还很陌生。我想我应该尝试编写一个脚本,使用etree从SVG图标文件中检索
glyph name
unicode
,从而从中创建一个更少的文件

蛮力解 我编写了一个解决方案,迭代SVG元素以获得元素属性,将它们放入一个列表中,然后从列表中的属性编写我的LESS样式。它看起来像这样:

SVG结构

FontForge 20170731于2019年3月13日星期三07:05:16由root创建
从lxml导入etree
filename=“font.svg”
tree=etree.parse(打开(文件名'r'))
#蛮力方法:遍历所有内容,然后遍历属性。
对于tree.iter()中的元素:
属性=[]
对于名称,元素.attrib.items()中的值:
如果(名称==“字形名称”)或(名称==“unicode”):
属性。插入(0,值)
如果类型(属性)!='bool'和len(属性)==2:
lessPreStyle+='''\
.icon-{name}{{
&:之前{{
内容:{unicode};
}}
}}
''。格式(名称=属性[0],unicode=repr(属性[1])。替换('\\u','\\'))
优雅的解决方案 现在,我试图通过只迭代glyph而不是每个元素来提高效率,并直接从对象获取属性,而不是迭代属性来检查它是否被称为
glyph name
unicode
。到目前为止,我有这样的想法:

#直接转到图示符的父级
font=tree.getroot()[1][0]
#仅过滤图示符
对于font.iter(“glyph”)中的glyph:
打印(glyph.attrib['unicode'])
打印(glyph.attrib['glyph-name'])

我目前的问题是font.iter('glyph')中glyph的
不返回任何内容。根据,我应该能够通过在
iter()
函数中输入我想要的子元素的名称来过滤子元素。然而,我什么也没有得到。如果我删除过滤器并只打印子项的标记名,我将获得所有标记名。我不想像上次那样迭代和检查单个元素。我是不是遗漏了什么?或者有更好的方法实现同样的目标吗?

您的SVG有一个默认名称空间(
http://www.w3.org/2000/svg

要在
iter()
中指定名称空间,必须使用克拉克表示法。这基本上就是名称空间uri和本地名称:
{http://www.w3.org/2000/svg}字形

您还可以使用
*
而不是实际的命名空间uri来匹配任何namspace中的元素:
{*}glyph

有关更多信息,请参阅和

例如:

from lxml import etree

tree = etree.parse("font.svg")

# Filter only glyphs
for glyph in tree.iter('{http://www.w3.org/2000/svg}glyph'):
    print(glyph.attrib['unicode'])
    print(glyph.attrib['glyph-name'])

它可能是默认名称空间
xmlns=”http://www.w3.org/2000/svg“
。参见此处:或此处:取决于您使用的是lxml还是ElementTree(不知道)。我会为您测试,但由于您的XML输入是一个屏幕截图,我没有时间重新创建它。@DanielHaley感谢您指出这一点。我正在使用
lxml
。我已经添加了导入和一个示例SVG文件,应该会有所帮助。感谢您的帮助和其他文档!这将给我更多的研究。