Python:使用命名空间解析SVG / XML

时间:2019-06-24 13:25:39

标签: python xml parsing svg namespaces

在Python中解析xml文件(在这种情况下为svg)很方便,但是只要文件中有名称空间,就不会起作用。为什么Python中的xml库确实有这种奇怪的行为? python库的名称空间是什么?

如果我的文件没有命名空间,我可以轻松地执行以下代码并获取所有元素:

import xml.etree.ElementTree as ET
tree = ET.parse('model1.svg')  
root = tree.getroot()
lst = root.findall('g/g/g/g')
print(lst)

但是由于它具有名称空间:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="temp" width="1809.6200256347656" height="1247.809829711914" version="1.1" viewBox="0 0 1809.6200256347656 1247.809829711914">

响应为:[]

如果我尝试打印root,我会得到:

<Element '{http://www.w3.org/2000/svg}svg' at 0x7fbc45154ea8>

代替此:

<Element 'svg' at 0x7f8ee9377368>

所以我无法使用它。如何停用/忽略它?

1 个答案:

答案 0 :(得分:0)

解决方案是使用带有预定义名称空间数组前缀的xml标记(例如g

import xml.etree.ElementTree as ET
tree = ET.parse('./model1.svg')
root = tree.getroot()

ns_array = {
    'svg': 'http://www.w3.org/2000/svg', 
    'xlink': 'http://www.w3.org/1999/xlink'
    }

lst = root.findall('svg:g/svg:g/svg:g/svg:g', ns_array)