XmlDocument и два корневых элемента

584
19 января 2017, 02:12

На входе есть строка, в которой находятся xml данные, по сути два корневых элемента которые записаны один после другого. При попытке загрузить эту строку в XmlDocument.LoadXml выдается ошибка -

Существует несколько корневых элементов

Изменить входную строку я не могу, и для работы мне нужен второй корневой элемент. Единственный выход который вижу - обрезать строку, но возможно есть более красивое решение?

Answer 1

Если у документа нет пролога, то можно завернуть весь документ в еще один тэг.

Answer 2

Первый способ - XmlDocumentFragment

Для того, чтобы загрузить несколько тэгов, можно воспользоваться классом XmlDocumentFragment. Создается он через функцию XmlDocument.CreateDocumentFragment, пример использования можно увидеть в документации на эту функцию.

В Linq2Xml аналогичного понятия не существует, поэтому надо использовать другие способы.

Второй способ - дописать корень

Можно использовать довольно популярный трюк, когда требующий разбора текст оборачивается в любой тег.

Этот способ требует отсутствия декларации XML или определений DTD.

Третий способ - через XmlReader

Можно создать 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(); // Пропуск закрывающего элемента
  }
  // Второй элемент загружается аналогично
}
READ ALSO
WPF Таблица XAML

WPF Таблица XAML

Ребят подскажите мне тугому как сделать подобную выгрузку элементов с бд с постраничной или динамической прокруткой данных? Задача: В базе...

1053
Привязка DataGridViewTextBoxColumn к другой таблице

Привязка DataGridViewTextBoxColumn к другой таблице

Привет всемТакой вопрос

438
Entity Framework 6.0 (ASP net core). не могу задать связь 1 ко многим

Entity Framework 6.0 (ASP net core). не могу задать связь 1 ко многим

Здравствуйте! Начал переносить проект на ASPNetCore MVCСтолкнулся с проблемой миграции базы данных при внесении новых 2-ух связей 1 ко многим

658
Как через код можно управлять системой частиц?

Как через код можно управлять системой частиц?

Как через код можно управлять системой частиц?

460