Python 为什么当我在font.iter(';glyph';)中运行“for glyph”时,etree从SVG中不返回任何内容? 目标
我对Python还很陌生。我想我应该尝试编写一个脚本,使用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
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文件,应该会有所帮助。感谢您的帮助和其他文档!这将给我更多的研究。