#c_sharp #xml
На входе есть строка, в которой находятся xml данные, по сути два корневых элемента которые записаны один после другого. При попытке загрузить эту строку в XmlDocument.LoadXml выдается ошибка - Существует несколько корневых элементов Изменить входную строку я не могу, и для работы мне нужен второй корневой элемент. Единственный выход который вижу - обрезать строку, но возможно есть более красивое решение?
Ответы
Ответ 1
Если у документа нет пролога, то можно завернуть весь документ в еще один тэг.Ответ 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(); // Пропуск закрывающего элемента } // Второй элемент загружается аналогично }
Комментариев нет:
Отправить комментарий