You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:15:03