2023年4月5日 星期三

JavaScript 轉譯 XML 特殊符號

JavaScript 轉譯 XML 特殊符號

因為只有5個而已沒有線程的函式庫可以用,自己刻了一個又覺得直接替換好像有點太簡單,姑且看了一下怎麼用一張映射表來轉譯。

這個可以透過修改映射表任意變更對應的關係,相對來說應用在別的對方要修改可能會方便不少。


代碼

先上最簡單的直接替換掉

// 將實體字符轉換為特殊字符
const encodeXml = str => str.replace(/&/g, '&')
                            .replace(/</g, '&lt;')
                            .replace(/>/g, '&gt;')
                            .replace(/"/g, '&quot;')
                            .replace(/'/g, '&apos;');

// 將特殊字符轉換為實體字符
const decodeXml = str => str.replace(/&amp;/g, '&')
                            .replace(/&lt;/g, '<')
                            .replace(/&gt;/g, '>')
                            .replace(/&quot;/g, '"')
                            .replace(/&apos;/g, "'");

再來這個是統一拉到映射表理管理的做法

// 映射表
const entitiesMap = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  "'": '&apos;',
}; const rvEntitiesMap = Object.fromEntries(Object.entries(entitiesMap).map(([k, v]) => [v, k]));

// 將實體字符轉換為特殊字符
const encodeXml = str => {
  const regex = new RegExp(`[${Object.keys(entitiesMap).join('|')}]`, 'g');
  return str.replace(regex, m => entitiesMap[m]);
};
// 將特殊字符轉換為實體字符
const decodeXml = str => {
  const regex = new RegExp(`(${Object.keys(rvEntitiesMap).join('|')})`, 'g');
  return str.replace(regex, m => rvEntitiesMap[m]);
};

// 測試
const text = '<root><node id="1">Hello & World</node></root>';
const encodedText = encodeXml(text);
const decodedText = decodeXml(encodedText);
console.log('原始文本:', text);
console.log('編碼後文本:', encodedText);
console.log('解碼後文本:', decodedText);

結果

原始文本: <root><node id="1">Hello & World</node></root>
編碼後文本: &lt;root&gt;&lt;node id=&quot;1&quot;&gt;Hello &amp; World&lt;/node&gt;&lt;/root&gt;
解碼後文本: <root><node id="1">Hello & World</node></root>




版本問題

反轉哈希表的部分需要ES2019才能跑,不能跑可以替換成這個舊版的寫法

const rvEntitiesMap = Object.entries(entities).reduce((acc, [k, v]) => {
  acc[v] = k;
  return acc;
}, {});

-

沒有留言:

張貼留言