@Avery007

[LINQ TO XML] Как получить все элементы из документа?

Нужно получить все элементы из документа в виде IEnumerable.
Про функцию Elements() знаю, но она возвращает лишь дочерние какого-либо элемента. А мне нужны полностью все которые есть.
  • Вопрос задан
  • 3714 просмотров
Решения вопроса 2
@Teacher
Добрый день.
Если вы хотите получить все элементы, включая вложенные, как один список, то вам придется рекурсивно обходить все дерево. Т.е. заводите, например List и начинаете обходить все элементы добавляя их в этот List. Добавили? Запускаем на их детках тот же самый алгоритм.
Ответ написан
Комментировать
aush
@aush
Descendants() ?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Avery007 Автор вопроса
Ну это мне понятно.
Но как мне обойти это дерево?
Ответ написан
Комментировать
@imlex
Можно воспользоваться методом XPathSelectElements с параметром expression равным "//*". Должно по идее сработать.
Ответ написан
Комментировать
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Linq 2 XML, говорите?
а не проще ли сразу сериализовать дерево обьектов парой строк кода, вроде такого:
public async Task<FileContentResult> Export()
{
// Выключаем Proxy при запросах, иначе сериализация выпадает с ошибкой.
            using (DefaultConnection conn = new DefaultConnection())
            {
                conn.Configuration.ProxyCreationEnabled = false;
// получаем нашу структуру с вложенными свойствами
                List<OurUnit> Units = conn.Units.Where(u => u.UserId == userId).Include(a => a.SubUnits).ToList();
                XmlSerializer serializer = new XmlSerializer(typeof(List<OurUnit>));
                StringWriter writer = new StringWriter();
                
                serializer.Serialize(writer, Units);

                System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding();
                byte[] writerToBytes = encoding.GetBytes(writer.ToString());
                FileContentResult file = new  FileContentResult(writerToBytes, "text/xml");
                file.FileDownloadName = CurrentUser.UserName + "  data " + DateTime.Now.ToString() + ".xml";
                conn.Configuration.ProxyCreationEnabled = true; 
                return file;
 }
Ответ написан
Комментировать
@Teacher
Вот демо пример, который обходит все дерево и выводит названия элементов на экран.
class Program
{
    static void Main(string[] args)
    {
        List<XElement> elements = GetElementsFromFile(@"ConsoleApplication35.exe.config");
        foreach (var item in elements)
        {
            Console.WriteLine(item.Name);
        }
        Console.ReadKey();
    }

    public static List<XElement> GetElementsFromFile(string p_fileName)
    {
        List<XElement> list = new List<XElement>();
        BuildElementList(XElement.Load(p_fileName).Elements(), list);
        return list;
    }

    private static void BuildElementList(IEnumerable<XElement> p_elements, List<XElement> p_list)
    {
        foreach (var item in p_elements)
        {
            p_list.Add(item);
            var children = item.Elements();
            if (children.Any())
            {
                BuildElementList(children, p_list);
            }
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы