Кодировать XML Объекты, если они не закодированы в Javascript - PullRequest
2 голосов
/ 14 марта 2020

У меня есть ситуация, когда я генерирую xml для запроса SOAP и получаю данные, которые поступают в этот xml от третьей стороны. Этот код выполняется на сервере и не имеет доступа к функциям в DOM. Иногда в данных будет уже закодировано xml сущностей, а в других случаях - нет.

Например, иногда я получу это: Billy & Joe's Garage

И в другое время я получу это: Billy & Joe's Garage

Я знаю, что есть решения для обработки первого примера, подобные тем, которые можно найти в этом посте: как избежать xml сущностей в javascript?

Но если применить эти решения ко второму примеру, я получу что-то вроде:

function escapeXml(unsafe) {
    return unsafe.replace(/[<>&'"]/g, function (c) {
        switch (c) {
            case '<': return '&lt;';
            case '>': return '&gt;';
            case '&': return '&amp;';
            case '\'': return '&apos;';
            case '"': return '&quot;';
        }
    });
}

escapeXml("Billy &amp; Joe&apos;s Garage")
// Returns "Billy &amp;amp; Joe&amp;apos;s Garage"

Так что для второго примера желаемый вывод будет таким же, как и ввод.

1 Ответ

1 голос
/ 14 марта 2020

Конечно, реальное решение - отказаться от испорченного XML и отправить его обратно поставщику. В то же время ...

Используя отрицательное прогнозное утверждение , вы можете исключить любые вхождения &, за которыми следуют amp;, quot; et c.

&(?!(amp|apos|lt|gt|quot);)

сделает именно это.

Объедините это с регулярным выражением из вашего вопроса, и вы сможете обойти те амперсанды, которые уже являются частью распознаваемой сущности, заменяя те, которые не являются:

const re = /&(?!(amp|apos|lt|gt|quot);)|[<>'"]/g

function escapeXml(unsafe) {
  return unsafe.replace(re, function(c) {
    switch (c) {
      case '<':
        return '&lt;';
      case '>':
        return '&gt;';
      case '&':
        return '&amp;';
      case '\'':
        return '&apos;';
      case '"':
        return '&quot;';
    }
  });
}
console.log(escapeXml("'Billy &amp; Joe&apos;s Garage & something else'"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...