Каков наилучший способ удаления мошеннических амперсандов в XML? - PullRequest
0 голосов
/ 23 октября 2018

(TLDR внизу)

У нас есть устаревшая система, в которой реализована собственная программа чтения / записи XML.Проблема в том, что он допускает буквальное «&» внутри значения свойства.

<SB nae="Name" net="HV & DD"/>

Когда я читаю данные с использованием метода XDocument.Parse (), это, конечно, не получается.Я смотрю на способы очистки данных.

Я пытаюсь использовать регулярные выражения для выявления случаев, когда это происходит.Чтобы проиллюстрировать это, рассмотрим следующее:

&(?!amp\;)

Это будет идентифицировать амперсанд с отрицательным прогнозом, чтобы убедиться, что это не правильно экранированный амперсанд.Когда я идентифицировал эти случаи, я могу заменить их на правильный &

. Конечно, есть проблема, что это будет соответствовать другому экранированному символу, такому как <<и т. Д., Поэтому я также должен сопоставить их. Возможноиспользуя более общую форму, такую ​​как регулярное выражение, не сопоставляя амперсанд, за которым следуют 2-4 символа и затем точку с запятой. </p>

Но меня беспокоит то, что существуют другие случаи амперсандов, о которых я не думаю и которые не представлены внесколько образцов, которые я получил. Я ищу безопасный способ, который не испортит надлежащий xml.

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

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете заменить следующий шаблон регулярных выражений на &amp;:

&(?!(?:#\d+|#x[0-9a-f]+|\w+);)

Демо: https://regex101.com/r/3MTLY9/2

...