Я знаю, что это не тот ответ, который вы хотите - но спецификация XML довольно ясна и строгая.
Малоформатный XML является фатальным.
Если это не работает в валидаторе, то ваш код не должен даже пытаться «исправить» его, не более того, чем вы попытаетесь автоматически «исправить» какой-либо программный код.
От Anotated XML Specification:
фатальная ошибка [Определение:] Ошибка которой соответствующий процессор XML должен обнаружить и сообщить приложению. После столкновения с фатальной ошибкой процессор может продолжить обработку данных для поиска дальнейших ошибок и может сообщать о таких ошибках приложению. Чтобы поддерживать коррекцию ошибок, процессор может делать необработанные данные из документа (с перемешанными символьными данными и разметкой), доступными для приложения. Однако, если обнаружена фатальная ошибка, процессор не должен продолжать нормальную обработку (т. Е. Он не должен продолжать передавать персональные данные и информацию о логической структуре документа в приложение обычным способом).
И конкретно в комментарии о том, почему: "Draconian" error-handling
Мы хотим XML, чтобы расширить возможности программистов писать код, который может быть передан через Интернет и выполнять на большом количестве компьютеров.Однако, если этот код должен включать обработку ошибок для всех видов неаккуратных практик конечных пользователей, он по необходимости должен иметь размер шара до такой степени, что он, например Netscape Navigator или Microsoft Internet Explorer, имеет размер в десятки мегабайт, побеждая цель.
Если вы когда-либо пытались собрать парсер HTML, вы поймете, почему это должно быть так - вы в конечном итоге писать СТОЛЬКИХ обработчик для особых случаев, плохие теги вложений, закрытие неявного тега что ваш код является беспорядком с самого начала.
И потому, что это моя любимая запись на переполнение стека - вот пример того, почему: RegEx match open tags except XHTML self-contained tags
Теперь я ценю это не всегда вариант, и вы, вероятно, не придет сюда, если спрашивать ваш вверх по течению " исправить ваш XML "был путь наименьшего сопротивления. Однако я бы все же настоятельно рекомендовал вам сообщать об этом как о дефекте в приложении для создания XML и как можно больше сопротивляться давлению, чтобы «исправить» программно, потому что, как вы правильно поняли, он создает себе мир боли, когда справа Ответ «Исправить проблему у источника».
Если вы действительно застряли на этой дороге, вы можете - как указывает Sinan Ünür - ваш единственный вариант - это ловушка, в которой вы парсер не сработали, а затем осмотрите и попробуйте отремонтировать, как вы идете. Но вы не найдете синтаксический анализатор XML, который сделает это за вас, потому что тот, который делает, - по определению.
Я бы предложить что сначала:
- выкопать копия спецификации, чтобы показать тому, кто попросил вас сделать это.
- указывают на то, что вся причина, по которой мы имеем стандарты, заключается в содействии интероперабельности.
- Поэтому, делая что-то, что преднамеренно нарушает стандарт, вы рискуете бизнесом - вы создаете код, который может однажды загадочно сломаться, потому что использование таких вещей, как регулярные выражения или автоматическая фиксация, строится в виде набора предположений это может не совпадать.
- Полезная концепция здесь technical debt - объясните, что вы несете технический долг за счет автоматической фиксации, для чего-то, что действительно не является вашей проблемой.
- Затем спросите их, хотят ли они принять этот риск.
- Если они думают, что это приемлемый риск, то просто продолжайте с ним - вы можете счесть это достойным внимания - игнорируя тот факт, что ваши исходные данные выглядят как XML и обрабатывают его так, как если бы это был обычный текст - используйте регулярные выражения для извлечения соответствующих строк данных и т. д.
- Приведите извинения в комментариях к вашему будущему программисту по обслуживанию, объяснив, кто принял решение и почему.
Также может быть полезным в качестве ориентира: Which character should not be set as values in XML file
Is неэкранированный '<' всегда следует пробел? – choroba
Похоже не всегда. Это также не всегда первый символ после «.Это может быть что-то вроде v =« 3 <2 » – disruptiveglow
Тег не может начинаться с пробела или числа. Возможно ли иметь' v = "a choroba