如何将Autodesk Inventor XML材料库转CSV并映射ID与%占位符
将Autodesk Inventor XML材料库转换为结构化CSV的方法
要完成XML到CSV的转换,核心是先建立占位符与实际文本的映射,再替换主文件中的占位符,最终生成结构化表格。以下是具体步骤:
1. 解析资源文件,构建占位符映射字典
Mat.SI.res.xml是专门存储占位符对应文本的资源文件,里面的<string>标签定义了%xxx%格式占位符与实际含义的映射。我们需要先读取这个文件,把映射关系存入字典:
import xml.etree.ElementTree as ET # 解析资源映射文件 res_tree = ET.parse('Mat.SI.res.xml') res_root = res_tree.getroot() # 构建占位符->实际文本的映射字典 placeholder_map = {} for string_item in res_root.findall('string'): placeholder = string_item.attrib['id'] actual_text = string_item.attrib['value'] placeholder_map[placeholder] = actual_text
2. 解析主XML文件,提取并替换数据
Mat.SI.xml包含材料库的结构定义和实际数据:
<Columns>节点定义了CSV的表头(用Description属性的占位符对应实际列名)<Data>下的<Row>节点是每一行的材料数据
提取表头
遍历<Columns>下的每个列节点,用映射字典替换Description里的占位符,得到CSV的表头:
# 解析主材料库文件 main_tree = ET.parse('Mat.SI.xml') main_root = main_tree.getroot() # 获取表头(使用Description属性的替换值) columns = main_root.find('.//Columns') csv_headers = [] for col in columns: # 替换Description中的占位符,作为列名 desc_placeholder = col.attrib.get('Description', '') header_name = placeholder_map.get(desc_placeholder, desc_placeholder) csv_headers.append(header_name)
提取并替换数据行
遍历<Data>下的每个<Row>,替换每个字段中的占位符,保留数值类数据:
# 获取所有数据行 data_rows = [] rows = main_root.findall('.//Data/Row') for row in rows: csv_row = [] for col in columns: col_tag = col.tag # 获取当前列的文本内容 cell_text = row.find(col_tag).text if row.find(col_tag).text else '' # 如果是占位符,替换为实际文本;否则直接保留 if cell_text in placeholder_map: csv_row.append(placeholder_map[cell_text]) else: csv_row.append(cell_text) data_rows.append(csv_row)
3. 写入CSV文件
用Python内置的csv模块将表头和数据写入文件:
import csv # 写入CSV文件 with open('materials_si.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) writer.writerow(csv_headers) writer.writerows(data_rows)
注意事项
- 部分占位符(如
%565%、%574%)未出现在提供的资源片段中,需完整解析整个Mat.SI.res.xml文件才能获取对应文本。 - 主文件中的长ID(如
D8894772B88F495093C43AF905AB6373)是内部标识,若不需要可在提取数据时过滤该列。
内容的提问来源于stack exchange,提问作者Purushottam Nawale
相关产品推荐
相关产品推荐

