ReactJS+Typescript项目中如何将XML映射为对象列表,求解析函数实现
helperParseFunction 实现方案
你需要的工具函数核心能力是解析OOXML格式的XML字符串为可操作的DOM对象,同时可扩展提取属性映射到你定义的WordItems接口结构,以下分两种场景给出实现:
1. 适配你现有React代码的基础实现
这个版本直接返回XML DOM对象,你后续获取w:r标签的原有逻辑不需要修改:
const helperParseFunction = (xmlStr: string): Document => { // 浏览器原生XML解析器 const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlStr, "text/xml"); // 校验解析错误 const parseError = xmlDoc.querySelector("parsererror"); if (parseError) { throw new Error("XML解析失败:" + parseError.textContent); } return xmlDoc; };
如果是Node.js服务端环境使用,把原生DOMParser替换为xmldom包的导出即可,核心逻辑完全一致。
2. 直接返回WordItems对象列表的扩展实现
如果你需要直接从XML映射得到符合接口定义的对象列表,不需要后续手动处理DOM,可以用这个版本:
export interface WordItems { title: string; isOfficeInitialized: boolean; wSpacing: string; wFonts: string; wLang: string; wSz: number; // 从xml的w:val属性取值 } const helperParseFunction = (xmlStr: string): WordItems[] => { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlStr, "text/xml"); const parseError = xmlDoc.querySelector("parsererror"); if (parseError) throw new Error("XML解析失败:" + parseError.textContent); // 获取所有run节点 const runs = xmlDoc.getElementsByTagName("w:r"); const wordItemsList: WordItems[] = []; for (let i = 0; i < runs.length; i++) { const run = runs[i]; const rPr = run.querySelector("w\\:rPr") || run.querySelector("rPr"); // 取文本内容作为title const title = run.textContent?.trim() || ""; if (!title) continue; // 跳过空文本节点 // 提取各格式属性 const wSpacing = rPr?.querySelector("w\\:spacing")?.getAttribute("w:val") || "0"; const wFonts = rPr?.querySelector("w\\:rFonts")?.getAttribute("w:ascii") || "默认字体"; const wLang = rPr?.querySelector("w\\:lang")?.getAttribute("w:val") || "zh-CN"; const wSz = Number(rPr?.querySelector("w\\:sz")?.getAttribute("w:val") || 12); wordItemsList.push({ title, isOfficeInitialized: true, // 可根据你的实际初始化逻辑修改该字段值 wSpacing, wFonts, wLang, wSz }); } return wordItemsList; };
注意:选择器中的
w\\:是对命名空间冒号的转义,兼容不同浏览器对XML命名空间的识别逻辑。
内容的提问来源于stack exchange,提问作者Yener
相关产品推荐
相关产品推荐

