Как разобрать XML С недопустимыми символами в имени узла?
-
21-08-2019 - |
Вопрос
Итак, я пытаюсь разобрать некоторый XML, создание которого не находится под моим контролем.Проблема в том, что у них каким-то образом есть узлы, которые выглядят вот так:
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(MORNINGSTAR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(QUARTERSTAFF) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(SCYTHE) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRATNYR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRIPLE-HEADED_FLAIL) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(WARAXE) />
Visual Studio и .NET оба считают, что символы '(' и ')', используемые выше, полностью недопустимы.К сожалению, мне нужно обработать эти файлы!Есть ли какой-нибудь способ заставить классы чтения Xml не волноваться при виде этих символов, или динамически экранировать их или что-то в этом роде?Я мог бы выполнить какую-то предварительную обработку всего файла, но мне нужны символы '(' и ')', если они каким-то допустимым образом отображаются внутри узла, поэтому я не хочу просто удалять их все...
Решение
Это просто недопустимо.Предварительная обработка - ваш лучший выбор, возможно, с регулярным выражением - что-то вроде:
string output = Regex.Replace(input, @"(<\w+)\((\w+)\)([ >/])", "$1$2$3");
Редактировать:немного сложнее заменить "-" внутри скобок:
string output = Regex.Replace(input, @"(<\w+)\(([-\w]+)\)([ >/])",
delegate(Match match) {
return match.Groups[1].Value + match.Groups[2].Value.Replace('-', '_')
+ match.Groups[3].Value;
});
Другие советы
Если он не является синтаксически корректным, значит, это не XML.
XML очень строго относится к этому.
Если вы не можете заставить отправляющее приложение отправлять правильный XML-файл, то просто сообщите им, что неважно нижестоящий процесс видит это потерпит неудачу, будь то ваше или какое-либо другое приложение в будущем.
Если предварительная обработка невозможна, другой хитроумный механизм заключается в том, чтобы обернуть Stream
объект, который передается анализатору с пользовательским потоком.Этот поток мог бы искать <
символы, и когда он увидит один из них, установите флаг.До тех пор, пока >
характер такой, видите ли, что он мог съесть любого (
или )
Персонажи.Мы использовали что-то вроде этого, чтобы избавиться от символов NUL и ^Z, добавленных в XML-файл устаревшим транспортным механизмом.(Единственная уловка, которая там может быть <
символы внутри атрибута, поскольку их не обязательно экранировать там - только >
персонажи так и делают.)