ok,在花了太多时间试图想出一种使用递归创建字典的方法之后,我想我已经意识到我想不出一种方法来做这件事。我是递归的新手,但我相信这是处理树和字典的最佳方式。下面是我试图创建的结构示例,这是从 SVG 文件(使用 python 的 XML 解析器)获得的 链接到 svg 这是我在 python 中使用的 SVG xml 解析器的示例:
import xml.etree.ElementTree as ET
path_to_svg = "/images/test/mysvg.svg"
tree = ET.parse(path_to_svg)
root = tree.getroot() # Getting Root element of the SVG XML
first_layer = root[1]
其中 firs_layer 表示 SVG 文件中的主层。目标是能够根据 SVG 结构识别组及其子项。 理想情况下,它类似于:
{
"items": [
{
"someattribute": {
"": "#ffffff",
"rule": "evenodd"
},
"height": "5.1593742",
"name": "myunit",
"type": "rectangle",
}
],
"name": "layer1",
"transform": "translate(-13.956264)",
"type": "g" // g stands for group
}
我真正想要实现的是树结构,能够基于SVG结构按层次分组项目,我觉得我在这上面花了太多时间,我想不通。我会很感激一些帮助。谢谢!
def recursiveTree(items, pre=None) -> dict:
# pre = pre if pre else {}
# pre = pre[:] if pre else []
print("i made it here")
if len(element) <=1 and element.tag != 'title':
return element
else:
for item in items:
# temp = None
# group = None
if formatstr(item.tag) == 'g':
print('made it here')
group = {"items": [recursiveTree(item, pre)], "name": item.attrib['id'], "transform": item.attrib['transform'],
"type":"group"}
return group
elif formatstr(element.tag) != 'g':
if formatstr(element.tag == "path"):
stroke, fill = styleParser(style_ie)
temp = {'d': element.attrib['d'], 'fill':fill,'name': element.attrib['id'], 'stroke': stroke,
'style':{},
'type': 'path'}
return temp
else:
return item
print(recursiveTree(root[1]))
这是我尝试过的示例,但我知道这不是返回我需要的结构的正确方法。 这是预期的输出:
但如果该组有嵌套组,结构将类似于:
{
"items": [
{
"items": [
{
// This is a group inside a group
"rectangle":{
"height": "5.1593742",
"name": "myunit",
"paint": "#00000",
},
"path":{
"d": "m 200.68604,100.33686 1.42273,0.007",
"name": "mypath",
"paint" "#fffff"
}
}],
"rectangle":{
"height": "5.1593742",
"name": "myunit",
"paint": "#00000",
}
}
],
"name": "layer1",
"transform": "translate(-13.956264)",
"type": "g" // g stands for group
}