Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
1

Как считать весь xml файл?

21.06.2019, 00:48. Просмотров 1208. Ответов 8
Метки net, xml (Все метки)

Здравствуйте! Коллеги, прошу Вас о помощи! Перечитал много статей и уже взялся за книги, но хочется решить это вопрос радикально, а дело вот в чем: имеется xml файлы такой структуры

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>
-<head>-
  <Menu>-
     <Menu1>Достопримечателности города
       <PodMenu>Парки</PodMenu>
       <PodMenu>Памятники</PodMenu>
       <PodMenu>Архитектура</PodMenu>
  </Menu1>-
  <Menu2>Административные здания
       <PodMenu>Администрации</PodMenu>
       <PodMenu>Школы</PodMenu>
       <PodMenu>Садики</PodMenu>
  </Menu2>-
  <Menu3>Центральные улицы
      <PodMenu>Ставропольская</PodMenu>
      <PodMenu>Мичуги</PodMenu>
      <PodMenu>Колхозная</PodMenu></Menu3>
  </Menu>
</head>
Я хочу пройтись последовательно по всей структуре и считать:
1. Значения узла Menu
2. Сразу же за соответсвующим узлом меню его подпункты PodMenu

Вот мой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            var document = new XmlDocument();
            document.Load("Data\\Menu.xml");
            XmlNode root = document.DocumentElement;
 
         
            XmlNodeList nodeListplus = null;
 
 
            foreach (XmlNode node in root.ChildNodes)
            {
                MessageBox.Show(node.InnerText);
                
                foreach (XmlNode nodeplus in node.ChildNodes)
                {
                 MessageBox.Show(nodeplus.InnerText);
                }
                
 
            }
И вот что происходит: Код проходится по всем веткам, но выводит очень странным образом. У меня текст вывода сплошняком идет. Как сделать так, чтобы вывод был последовательный, т.е. каждый элемент считывался и выводился отдельно?

P.s.

Хочу уточнить, что вывод хочу сделать такой:
Достопримечателности города
Парки
Памятники
Архитектура

и т.д.
Все последовательно.

Заранее огромное спасибо)))
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2019, 00:48
Ответы с готовыми решениями:

Как поместить данные в xml файл, а потом считать?
Всем привет, искал данные про xml, но чет не разобрался. Поэтому спрошу у вас: как поместите эти...

Как считать и распарсить xml файл
Здраствуйте имеется xml файл &lt;?xml version=&quot;1.0&quot;?&gt; &lt;root&gt; &lt;item...

Как считать xml файл с сайта
Есть сайт который генерирует xml как получить доступ к этому xml файлу из своей странички. Вопрос...

Как считать все данные о файлах и сохранить в xml файл?
Добрый день. Подскажите пожалуйста. Как считать все данные о файлах (как считать имя, его размер в...

8
Эксперт .NET
6846 / 4453 / 1068
Регистрация: 25.05.2015
Сообщений: 13,614
Записей в блоге: 13
21.06.2019, 06:11 2
Не надо трогать свойство InnerText у нод, имеющих дочерние ноды. Потому что в нём вы считываете весь их текст "сплошняком".
0
601 / 576 / 157
Регистрация: 29.06.2010
Сообщений: 1,610
21.06.2019, 11:12 3
костыль, но задачу решит:

C#
1
2
3
4
5
6
foreach (XmlNode node in root.ChildNodes) {
                string text1 = node.InnerText.Split('<')[0];
                MessageBox.Show(text1); 
                foreach (XmlNode nodeplus in node.ChildNodes) 
                      MessageBox.Show(nodeplus.InnerText); 
            }
мог кавычки перепутать)
1
1343 / 793 / 431
Регистрация: 14.04.2015
Сообщений: 3,038
21.06.2019, 11:38 4
Stels007, эти файлы тебе в таком виде приходят? просто структура файла какая-то странная. разные имена нод Menu1,2,3 и их названия не в атрибутах, а где-то отдельно. Или ты сам его сформировал?

Добавлено через 1 минуту
поэтому для радикальный действий надо для начала сам xml переделать.
0
Эксперт .NET
6846 / 4453 / 1068
Регистрация: 25.05.2015
Сообщений: 13,614
Записей в блоге: 13
21.06.2019, 11:38 5
Цитата Сообщение от Stels007 Посмотреть сообщение
имеется xml файлы такой структуры
Кривая структура.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Xml.Linq;
 
namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            string strxml = @"
<head>
    <Menus>
        <Menu>
            <Title>Достопримечателности города</Title>
            <SubMenu>Парки</SubMenu>
            <SubMenu>Памятники</SubMenu>
            <SubMenu>Архитектура</SubMenu>
        </Menu>
        <Menu>
            <Title>Административные здания</Title>
            <SubMenu>Администрации</SubMenu>
            <SubMenu>Школы</SubMenu>
            <SubMenu>Садики</SubMenu>
        </Menu>
        <Menu>
            <Title>Центральные улицы</Title>
            <SubMenu>Ставропольская</SubMenu>
            <SubMenu>Мичуги</SubMenu>
            <SubMenu>Колхозная</SubMenu>
        </Menu>
    </Menus>
</head>";
 
            var doc = XDocument.Parse(strxml);
 
            foreach (var menu in doc.Root.Element("Menus")?.Elements("Menu"))
            {
                Console.WriteLine("Title: {0}", menu.Element("Title")?.Value);
 
                foreach (var submenu in menu.Descendants("SubMenu"))
                {
                    Console.WriteLine("Sub: {0}", submenu?.Value);
                }
            }
        }
    }
}
1
1343 / 793 / 431
Регистрация: 14.04.2015
Сообщений: 3,038
21.06.2019, 11:56 6
Лучший ответ Сообщение было отмечено Stels007 как решение

Решение

я бы сделал по-другому.
структура файла:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<head>
  <Menus>
    <Menu name = "Достопримечателности города">
      <SubMenu>Парки</SubMenu>
      <SubMenu>Памятники</SubMenu>
      <SubMenu>Архитектура</SubMenu>
    </Menu>
    <Menu name = "Административные здания">
      <SubMenu>Администрации</SubMenu>
      <SubMenu>Школы</SubMenu>
      <SubMenu>Садики</SubMenu>
    </Menu>
    <Menu name = "Центральные улицы">
      <SubMenu>Ставропольская</SubMenu>
      <SubMenu>Мичуги</SubMenu>
      <SubMenu>Колхозная</SubMenu>
    </Menu>
  </Menus>
</head>
код программы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            string InputXML = @"file.xml";
 
            XmlDocument XmlDoc = new XmlDocument();
 
            XmlDoc.Load(InputXML);
 
            foreach (XmlNode MenuNode in XmlDoc.GetElementsByTagName("Menu"))
            {
                foreach (XmlAttribute MenuAttributes in MenuNode.Attributes)
                {
                    Console.WriteLine($"{MenuAttributes.InnerText}:");
 
                    foreach (XmlNode MenuElements in MenuNode.ChildNodes)
                    {
                        Console.WriteLine($"- {MenuElements.InnerText}");
                    }
                }
            }
1
Эксперт .NET
6846 / 4453 / 1068
Регистрация: 25.05.2015
Сообщений: 13,614
Записей в блоге: 13
21.06.2019, 12:12 7
Я бы ещё submenu заменил на menu и организовал неограниченную вложенность.
1
281 / 200 / 72
Регистрация: 17.08.2014
Сообщений: 787
21.06.2019, 19:55 8
Rius, Через сериализацию еще проще, главное правильно классы написать)
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
26.06.2019, 00:15  [ТС] 9
AndreyVorobey, Большое спасибо за отклик! Это что нужно! Дай Бог Вам здоровья)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2019, 00:15

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Считать файл XML
Добрый день можете подсказать как считать файл xml следующего вида: &lt;univer&gt; &lt;faculty name =...

как считать весь файл ?
char buff; ifstream fin(&quot;/Users/Vitaly/Desktop/laba2/laba2/list.txt&quot;,ios_base::in); ...

Как Считать Весь Файл С++
Здравствуйте, у меня вопрос, если у меня есть файл, в нем у меня есть ентеры, как мне считать целый...

Считать весь файл и поместить в память целиком как массив строк
Разбираюсь с файлами, есть вопросы: 1) подскажите пожалуйста названия кодировок юникода...

Считать весь файл в строку
Делаю так: string name_of_file=&quot;abba.txt&quot;; ifstream fin(name_of_file); ...

Как считать весь текст из файла
здравствуйте! я vb новичок не судите строго нужно считать количество слов у меня получается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.