На входе есть строка, в которой находятся xml данные, по сути два корневых элемента которые записаны один после другого. При попытке загрузить эту строку в XmlDocument.LoadXml выдается ошибка -
Существует несколько корневых элементов
Изменить входную строку я не могу, и для работы мне нужен второй корневой элемент. Единственный выход который вижу - обрезать строку, но возможно есть более красивое решение?
Если у документа нет пролога, то можно завернуть весь документ в еще один тэг.
Для того, чтобы загрузить несколько тэгов, можно воспользоваться классом XmlDocumentFragment. Создается он через функцию XmlDocument.CreateDocumentFragment, пример использования можно увидеть в документации на эту функцию.
В Linq2Xml аналогичного понятия не существует, поэтому надо использовать другие способы.
Можно использовать довольно популярный трюк, когда требующий разбора текст оборачивается в любой тег.
Этот способ требует отсутствия декларации XML или определений DTD.
Можно создать XmlReader с настройкой ConformanceLevel.Fragment, передав ему StringReader (в случае когда надо распарсить строку). Для каждого из корневых элементов можно вызвать ReadSubtree, чтобы получить другой XmlReader, который уже можно передать в метод Load:
using (var reader = XmlReader.Create(new StringReader(str), new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }))
{
// Пропускаем мусор до начала первого элемента
while (reader.NodeType != XmlNodeType.Element && reader.Read()) ;
if (reader.NodeType == XmlNodeType.Element)
{
using (var subreader = reader.ReadSubtree())
{
doc1.Load(subreader); // загрузка первого элемента
}
reader.Read(); // Пропуск закрывающего элемента
}
// Второй элемент загружается аналогично
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости