Проблема в том, что 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. Наконец, он только улавливает амперсанды, а не другие запрещенные символы, такие как ‹. Обновление: на основе комментария мне также нужно обновить выражение для сущностей с шестнадцатеричным кодом (& # x ...;).
Что касается персонажей, которые могут вызвать проблемы, настоящие правила немного сложны. Например, в данных разрешены определенные символы, но не как первая буква имени элемента. И нет простого списка запрещенных символов. Вместо этого большая (несмежная) часть UNICODE определяется как допустимая, и все, кроме этого, незаконно.
Итак, когда дело доходит до этого, вы должны доверять своему источнику документа, чтобы он имел хотя бы определенную степень соответствия и согласованности. Например, я обнаружил, что люди часто достаточно умны, чтобы убедиться, что теги работают правильно и ускользают ‹, даже если они не знают, что & запрещено, отсюда и ваша проблема сегодня. Однако лучше всего исправить это у источника.
О, и примечание о предложении CDATA: я бы использовал это, чтобы убедиться, что xml, который я создаю, правильно сформирован, но при работе с существующим xml извне я нахожу метод регулярного выражения Полегче.
person
Joel Coehoorn
schedule
23.09.2008