Проблема в том, что XML не является правильно сформированным. Правильно сгенерированный xml будет перечислять эти данные следующим образом:
Prepaid & Charge
Я должен был решить ту же проблему раньше, и я сделал это с помощью этого регулярного выражения:
Regex badAmpersand = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)");
Объедините это со строковой константой, определенной следующим образом:
const string goodAmpersand = "&";
Теперь вы можете просто сказать badAmpersand.Replace(<your input>, goodAmpersand);
Обратите внимание, что простой String.Replace("&", "&")
недостаточно хорош, поскольку вы не можете заранее знать для данного документа, будут ли какие-либо символы & правильно закодированы, неправильно или даже оба в одном и том же документе.
Подвох здесь в том, что вы должны сделать это с вашим xml-документом перед загрузкой его в ваш анализатор, что, вероятно, означает дополнительный проход через него. Кроме того, он не учитывает амперсанды внутри раздела CDATA. Наконец, only ловит амперсанды, а не другие нелегальные символы, такие как <. <strong>Обновление: на основе комментария, мне нужно обновить выражение и для сущностей с шестнадцатеричным кодом (& # x ...;).
Относительно того, какие символы могут вызвать проблемы, действительные правила немного сложны. Например, определенные символы допускаются в данных, но не в качестве первой буквы имени элемента. И нет простого списка нелегальных персонажей. Вместо этого большая (несмежная) полоса UNICODE определена как допустимая , и все, что находится за ее пределами, является незаконным.
Так что, когда дело доходит до этого, вы должны доверять источнику документа, чтобы иметь хотя бы определенную степень соответствия и согласованности. Например, я обнаружил, что люди часто достаточно умны, чтобы убедиться, что теги работают должным образом и убегают <, даже если они не знают, что & не разрешено, поэтому ваша проблема сегодня. Тем не менее, <strong>лучше всего исправить это в источнике.
Да, и примечание о предложении CDATA: я бы использовал это, чтобы убедиться, что xml, что , который я создаю , правильно сформирован, но при работе с существующим xml извне я нахожу метод регулярных выражений проще.