Как разобрать XML С недопустимыми символами в имени узла?

StackOverflow https://stackoverflow.com/questions/1069114

Вопрос

Итак, я пытаюсь разобрать некоторый 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-файл устаревшим транспортным механизмом.(Единственная уловка, которая там может быть < символы внутри атрибута, поскольку их не обязательно экранировать там - только > персонажи так и делают.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top