我正在尝试使用 lxml
进行 SVG 解析,并且在命名空间方面遇到了困难。
问题:
- 如何使用命名空间映射和
tree.iterfind
遍历所有image
标签?tree.iterfind('image', root.nsmap)
不返回任何内容,而较丑的tree.iter('{http://www.w3.org/2000/svg}image')
可以正常工作。 - 我正在尝试将
image
标签转换为use
标签。虽然 lxml 给了我一个带有xlinx:href
属性字典,但将其传递给makeelement
时会出错,是否有更优雅的解决方案? - 我应该使用
lxml
还是有更好(更直接)的工具?我的目标是将image
标签重写为use
标签,并在符号中嵌入引用的 svg 的内容。(到目前为止,lxml
和我在命名空间方面遇到的问题令人反感。)
from lxml import etree
def inlineSvg(path):
parser = etree.XMLParser(recover=True)
tree = etree.parse(path, parser)
root = tree.getroot()
print(root.nsmap)
for img in tree.iter('{http://www.w3.org/2000/svg}image'):
#for img in tree.iterfind('image', root.nsmap): #for some reason I can't get this to work...
print(img)
#we have to translate xlink: to {http://www.w3.org/1999/xlink} for it to work, despit the lib returning xlink: ...
settableAttributes = dict(img.items()) #img.attribute
settableAttributes['{http://www.w3.org/1999/xlink}href'] = settableAttributes['xlink:href']
del settableAttributes['xlink:href']
print(etree.tostring(img.makeelement('use', settableAttributes)))
img.makeelement('use', img.attrib)
不起作用的问题在于我的svg文件缺少xmlns:xlink="http://www.w3.org/1999/xlink"
。有没有办法我可以添加它? - tedetree.register_namespace('xlink','http://www.w3.org/1999/xlink')
解决了我的问题。由于我的一些问题可能与CentOS上的pip
和yum
有关(动态库可能具有错误版本),我认为深入探究这个问题没有太大意义。但如果您仍然感兴趣,请查看此问题和答案。它包含一个最小的SVG示例,并且是研究etree的原因,答案是结果。 - ted