pub fn parse_from_xml(xml: &str) -> Result<Chart>Expand description
从 <c:chartSpace> XML 解析回 Chart 模型(TODO-004 读路径)。
与 Chart::to_xml 对称的解析函数,用于 Presentation::from_opc 阶段
读取 /ppt/charts/chartN.xml part 内容后还原 Chart 结构。
§解析策略
- chart_type:根据
<c:plotArea>下的图表元素名(c:barChart/c:lineChart/c:pieChart/c:scatterChart/c:areaChart/c:radarChart/c:bubbleChart) 判断;对c:barChart额外读取<c:barDir val="col|bar">区分 Column / Bar。 - title:从
<c:title><a:tx><a:rich>...<a:t>文本</a:t>提取第一个文本节点。 - categories:从第一个
<c:ser>的<c:cat><c:strRef><c:strCache>提取类别标签 (所有系列共享同一类别轴,取第一个即可;散点图/气泡图无c:cat,类别列表为空)。 - series:遍历每个
<c:ser>,提取:name:<c:tx><c:strRef><c:strCache><c:pt><c:v>values:<c:val><c:numRef><c:numCache><c:pt><c:v>(Y 值)x_values:<c:xVal><c:numRef><c:numCache><c:pt><c:v>(仅散点图/气泡图)bubble_sizes:<c:bubbleSize><c:numRef><c:numCache><c:pt><c:v>(仅气泡图)
§容错
- 缺失
<c:plotArea>或其中无已知图表元素 → 返回Column占位类型(避免阻塞 round-trip); - 单个系列的 numCache/strCache 解析失败 → 该系列用空数据填充,不中断整体解析;
- 不解析
<c:axId>/<c:catAx>/<c:valAx>/<c:legend>等装饰元素 (写出时由Chart::to_xml按图表类型自动重建)。
§参数
xml:完整的<c:chartSpace>XML 字符串(chartN.xml 内容)。
§返回值
- 成功:返回
Chart,rid字段为空字符串(由调用方根据 slide rels 填充); - 失败:返回
Error::Xml,包含解析错误上下文。
§示例
let xml = std::fs::read_to_string("chart1.xml").unwrap();
let chart = Chart::parse_from_xml(&xml).expect("parse chart");
println!("type: {:?}, series: {}", chart.chart_type, chart.data.series.len());