使用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
相关产品推荐
相关产品推荐

