Исправьте неверно сформированный XML, прежде чем я десериализую его

1

Из-за ошибки PHP в другом продукте я иногда получаю плохо сформированный XML-ответ, например:

<?xml version="1.0" encoding="UTF-8"?>
<customfields>
</customfields>Warning
Router: https://example.com/api/index.php?/Tickets/TicketCustomField/Get
file_put_contents(./__swift/cache/SWIFT_Loader.cache): failed to open stream: Invalid argument (C:/Kayako/support/__swift/library/Loader/class.SWIFT_Loader.php:1630)

Существует ли безопасный метод для очистки этой строки, прежде чем я десериализую ее?

Требование дубликата верное, но связанный дубликат не дает рабочего решения.

Текущее временное решение работает только в том случае, если стартовая строка действительна XML, а прилагаемая ошибка не содержит другого закрывающего тега, который соответствует корневому тегу:

RegexOptions options = RegexOptions.Singleline | RegexOptions.Compiled;
var tidyStreamContents = Regex.Match(streamContents, @"^<\?xml.*?\?>\s*?<(.*?)>.*</(\1)>", options, Regex.InfiniteMatchTimeout).ToString();
  • 1
    Вы можете бросить все после последнего > , несколько наивно, но это может сработать. Рассматривали ли вы возможность связаться со службой поддержки продукта?
Теги:
xml-deserialization

1 ответ

0

Вы можете использовать CsQuery для обработки недопустимого XML как HTML, очистки его и вывода в виде строки для дальнейшей обработки:

using CsQuery;

var cq = CQ.CreateFromFile("input.txt");
var sCleanXML = cq("customfields").RenderSelection;

Вход (содержимое input.txt):

<?xml version="1.0" encoding="UTF-8"?>
<customfields>
</customfields>Warning
Router: https://example.com/api/index.php?/Tickets/TicketCustomField/Get
file_put_contents(./__swift/cache/SWIFT_Loader.cache): failed to open stream: Invalid argument (C:/Kayako/support/__swift/library/Loader/class.SWIFT_Loader.php:1630)

Выход (значение sCleanXML):

<customfields> </customfields>

Альтернативой может быть использование XmlReader или HtmlAgilityPack.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню