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

使用js2xmlParser时如何在XML元素名称中包含问号等特殊字符?

前提说明

XML 1.0/1.1 官方规范明确限制了元素名称仅允许包含字母、数字、下划线、连字符、点以及符合要求的Unicode字符,禁止使用问号、空格、&、< 等特殊字符。因此你想要直接生成<isGlobal?>这种标签是不符合标准的,即便强行构造出文本形式的XML,后续所有合规的XML解析器也无法正常识别解析。

以下是两种不丢失原始列名信息的可行解决方案:


方案1:调整XML结构,将列名作为属性存储

该方案完全符合XML规范,不需要做转义还原,可读性更高,推荐优先使用:

目标输出格式

<?xml version='1.0' encoding='UTF-8'?>
<BBPXMLSchnittstelle>
  <data>
    <column name="isGlobal?">no</column>
  </data>
  <data>
    <column name="isGlobal?">yes</column>
  </data>
</BBPXMLSchnittstelle>

改造后代码

const row = [
  {
    'isGlobal?': 'no'
  },
  {
    'isGlobal?': 'yes'
  }
];

// 预处理数据,将特殊键名转为属性存储
const processedRows = row.map(item => {
  const [colName, colValue] = Object.entries(item)[0];
  return {
    column: {
      '@': { name: colName }, // @在js2xmlparser中表示节点属性
      '#': colValue // #在js2xmlparser中表示节点文本内容
    }
  };
});

const obj = {
  data: processedRows
};

const xmlResult = js2xmlparser.parse('BBPXMLSchnittstelle', obj, {declaration: {encoding: 'UTF-8'}});

方案2:对特殊字符做可逆转义

如果你需要保留原有标签结构,可以把特殊字符转义为合法的标识符,后续解析时再还原,不会丢失原始信息:

转义规则说明

我们可以把?统一转义为__QMARK__(可自定义不会和现有列名冲突的转义串),解析时再替换回?即可。

改造后代码

const row = [
  {
    'isGlobal?': 'no'
  },
  {
    'isGlobal?': 'yes'
  }
];

// 转义函数:把问号替换为合法字符串
const escapeXmlName = (name) => name.replace(/\?/g, '__QMARK__');
// 还原函数:后续解析XML时调用即可恢复原始列名
const unescapeXmlName = (name) => name.replace(/__QMARK__/g, '?');

// 预处理所有键名
const processedRows = row.map(item => {
  const processedItem = {};
  Object.entries(item).forEach(([key, value]) => {
    processedItem[escapeXmlName(key)] = value;
  });
  return processedItem;
});

const obj = {
  data: processedRows
};

const xmlResult = js2xmlparser.parse('BBPXMLSchnittstelle', obj, {declaration: {encoding: 'UTF-8'}});

内容的提问来源于stack exchange,提问作者ShadaMon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 04:00:05