11 / 11 / 11
Регистрация: 16.07.2014
Сообщений: 55

Чтение XML через XDocument и формирование TreeView

16.07.2014, 16:37. Показов 5963. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Хочу считать xml файл и заполнить treeView в C#.
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
 
namespace v3
{
    public partial class Form1 : Form
    {       
        int trackId;
        string pwd;
        public Form1()
        {
            InitializeComponent();           
            trackId = 1;
        }
 
   
        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Data files |*.xml|All iles|*.*";
            if (open.ShowDialog() == DialogResult.OK)
            {
                pwd = open.FileName;
            }
 
 
            XDocument doc = XDocument.Load(pwd);
         
            foreach (XElement el in doc.Root.Elements())
            {           
                TreeNode node = treeView1.Nodes.Add(el.Name.ToString() + trackId);
              
                TreeNode node2 = new TreeNode();
                node2.Text = "Attributes";
                node.Nodes.Add(node2); 
     
                atrib(el, node2);            
                
                TreeNode node22 = new TreeNode();
                node22.Text = "Elements";
                node.Nodes.Add(node22);
             
                foreach (XElement element in el.Elements())
                {                    
                    TreeNode node32 = new TreeNode();
                    node32.Text=element.Name.ToString() + element.Value;
                    node22.Nodes.Add(node32);
                    TreeNode node33 = new TreeNode();
                  
                    node33.Text = "Attributes";
                    node32.Nodes.Add(node33);
                    atrib(element, node33);
                 
                }
                trackId += 1;
            }
 
        }
        void atrib(XElement elements, TreeNode nodeX)
        {
            foreach (XAttribute att in elements.Attributes())
            {
                TreeNode node3 = new TreeNode();
                node3.Text = att.ToString();
                nodeX.Nodes.Add(node3);
            }
        }
    
        
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<library>
  <track id="1" genre="Rap" time="3:24">
    <name>Who We Be RMX (feat. 2Pac)</name>
    <artist>DMX</artist>
    <album>The Dogz Mixtape: Who's Next?!</album>
  </track>
  <track id="2" genre="Rap" time="5:06">
    <name>Angel (ft. Regina Bell)</name>
    <artist>DMX</artist>
    <album>...And Then There Was X</album>
  </track>
  <track id="3" genre="Break Beat" time="6:16">
    <name>Dreaming Your Dreams</name>
    <artist>Hybrid</artist>
    <album>Wide Angle</album>
  </track>
  <track id="4" genre="Break Beat" time="9:38">
    
  </track>
</library>

И вот вопрос как пройти по всем элементам. Так как в каждом элементе может быть еще куча элементов.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2014, 16:37
Ответы с готовыми решениями:

Create XML file with XPath, using XDocument
Здравствуйте! (тема на англ, т.к. форум не позволяет использовать понятное русское название) Требуется создать XML файл с помощью...

Чтение xml файла через for
Здравствуйте, как сделать так, чтобы progressbar работал по мере добавления, знаю, как сделать через for, но не знаю, как двигать...

Опросник. Создание дерева зависимостей в treeView, сохранение дерева в XML, построение дерева в treeView из XML
Всем доброго времени суток. Тема является продолжением вот этой темы. Создаю 2ю, так как там был другой вопрос, который скорее...

6
 Аватар для temkiiiiin
28 / 15 / 4
Регистрация: 30.09.2012
Сообщений: 43
17.07.2014, 08:08
Лучший ответ Сообщение было отмечено Igor_s как решение

Решение

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public partial class Form1 : Form
    {
        TreeView treeView;
        Button openFileBtn;
 
        public Form1()
        {
            InitializeComponent();
 
            openFileBtn = new Button() { Text = "open", Width = 50, Height = 20 };
            openFileBtn.Click += openFileBtn_Click;
            Controls.Add(openFileBtn);
 
            treeView = new TreeView()
            { 
                Location = new Point(0, openFileBtn.Bottom + 5), 
                Width = this.Width, 
                Height = this.Height - openFileBtn.Bottom + 5 
            };
            Controls.Add(treeView);
        }
 
        void openFileBtn_Click(object sender, EventArgs e)
        {
            string fileName;
 
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Data files |*.xml|All iles|*.*";
            if (open.ShowDialog() == DialogResult.OK)
            {
                fileName = open.FileName;
 
                XDocument doc = XDocument.Load(fileName);
 
                TreeNode root = new TreeNode(doc.Root.Name.ToString());
                treeView.Nodes.Add(root);
 
                ReadNode(doc.Root, root);
            }
        }
 
        void ReadNode(XElement xElement, TreeNode treeNode)
        {
            foreach (XElement el in xElement.Elements())
            {
                TreeNode node = new TreeNode(el.Name.ToString());
                treeNode.Nodes.Add(node);
                ReadNode(el, node);
            }
        }
 
        void atrib(XElement elements, TreeNode nodeX)
        {
            foreach (XAttribute att in elements.Attributes())
            {
                TreeNode node3 = new TreeNode();
                node3.Text = att.ToString();
                nodeX.Nodes.Add(node3);
            }
        }
    }
1
11 / 11 / 11
Регистрация: 16.07.2014
Сообщений: 55
17.07.2014, 12:58  [ТС]
temkiiiiin, Спасибо.

Добавлено через 1 час 38 минут
temkiiiiin , А как добавить к функции
Цитата Сообщение от temkiiiiin Посмотреть сообщение
void ReadNode(XElement xElement, TreeNode treeNode)
что то типо node = new TreeNode(el.Name.ToString() + " " + el.Value);
Что бы не только элементы но и их значения.

Название: 24664_Snimok.PNG
Просмотров: 475

Размер: 5.8 Кб

вот как пример около name.
0
 Аватар для temkiiiiin
28 / 15 / 4
Регистрация: 30.09.2012
Сообщений: 43
17.07.2014, 13:53
А подумать? Попробовать? В отладку зайти?
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
 
namespace TestForm
{
    public partial class Form1 : Form
    {
        TreeView treeView;
        Button openFileBtn;
 
        public Form1()
        {
            InitializeComponent();
 
            openFileBtn = new Button() { Text = "open", Width = 50, Height = 20 };
            openFileBtn.Click += openFileBtn_Click;
            Controls.Add(openFileBtn);
 
            treeView = new TreeView()
            { 
                Location = new Point(0, openFileBtn.Bottom + 5), 
                Width = this.Width, 
                Height = this.Height - openFileBtn.Bottom + 5 
            };
            Controls.Add(treeView);
        }
 
        void openFileBtn_Click(object sender, EventArgs e)
        {
            string fileName;
 
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Data files |*.xml|All iles|*.*";
            if (open.ShowDialog() == DialogResult.OK)
            {
                fileName = open.FileName;
 
                XDocument doc = XDocument.Load(fileName);
 
                TreeNode root = new TreeNode(doc.Root.Name.ToString());
                treeView.Nodes.Add(root);
 
                ReadNode(doc.Root, root);
            }
        }
 
        void ReadNode(XElement xElement, TreeNode treeNode)
        {
            foreach (XElement element in xElement.Elements())
            {
                TreeNode node = new TreeNode(element.Value.ToString());
                treeNode.Nodes.Add(node);
 
                if (element.HasAttributes)
                {
                    TreeNode attributesNode = new TreeNode("Attributes");
                    ReadAttributes(element, attributesNode);
                    node.Nodes.Add(attributesNode);
                }
 
                ReadNode(element, node);
            }
        }
 
        void ReadAttributes(XElement element, TreeNode treeNode)
        {
            foreach (XAttribute attribute in element.Attributes())
            {
                TreeNode node = new TreeNode(attribute.ToString());
                treeNode.Nodes.Add(node);
            }
        }
    }
}
2
1 / 1 / 0
Регистрация: 25.03.2012
Сообщений: 9
26.10.2014, 10:16
Отличное решение.
Я тоже изучаю работу TreeView и её построение с помощью разных классов. Попробовал построить вместо XElement аналогом XmlElement. Но тут возникает проблема, когда treeNode передает XmlElement комментарий. В принципе комментарий так же можно использовать как ноду, но вот как её правильно скормить, пока не знаю. Надеюсь на вашу помощь.


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
class XMLParser
    {
        
        
        public static void ReadNode(XmlElement xmlElement, TreeNode treeNode)
        {
            
            
            foreach (XmlElement element in xmlElement) // xmlElement.GetElementsByTagName(xmlElement.Name))
                {
                    TreeNode node = new TreeNode(element.Name);
                    treeNode.Nodes.Add(node);
 
                    if (element.HasAttributes)
                    {
                        TreeNode attributesNode = new TreeNode(node.FullPath);
                        ReadAttributes(element, node);
                        node.Nodes.Add(attributesNode);
                        // нашлепка чтобы удалить последний якобы атрибут "надо починить"
                        if (attributesNode.Text == node.FullPath)
                        {
                            node.Nodes.Remove(attributesNode);
                        }
 
                    }
 
                    ReadNode(element, node);
                }
            }
      
        public static void ReadAttributes(XmlElement element, TreeNode treeNode)
        {
            foreach (XmlAttribute attribute in element.Attributes)
            {
                TreeNode node = new TreeNode(attribute.ToString());
                treeNode.Nodes.Add(node);
            }
        }
    }
Это в кнопке:
C#
1
2
3
4
5
6
7
8
9
10
11
 private void xmlButton_Click(object sender, EventArgs e)
        {
            treeView.Nodes.Clear();
            xmlDoc.Load("C:\\Web.config");
            
            rootNode = new TreeNode(xmlDoc.DocumentElement.Name); 
            treeView.Nodes.Add(rootNode);
            ParseXML.XMLParser.ReadNode(xmlDoc.DocumentElement, rootNode);
           // ParseXML.AddNodeClass.AddNode(xmlDoc,rootNode);
            treeView.Nodes[0].Expand();
        }
Вот вариант, который отлично работает но построение дерева через дочернее, то есть атрибуты как дочерние ноды не строятся:
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
public static void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
        {
 
            XmlNode xNode;
            TreeNode tNode;
            XmlNodeList nodeList; 
            int i;
 
            if (inXmlNode.HasChildNodes)
            {
                nodeList = inXmlNode.ChildNodes;
                for (i = 0; i <= nodeList.Count - 1; i++)
                {
                    xNode = inXmlNode.ChildNodes[i];
                    inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
                    tNode = inTreeNode.Nodes[i];
                    AddNode(xNode, tNode);
                }
               
            }
 
            else
            {
                inTreeNode.Text = (inXmlNode.OuterXml).Trim();
            }
 
        
        }
0
1 / 1 / 0
Регистрация: 25.03.2012
Сообщений: 9
26.10.2014, 10:58
Думаю лучше использовать AddNode т.к. я после собираюсь сохранять дерево в XML.

Для удобства вот Web.config с которым я работаю
Вложения
Тип файла: rar Web.rar (7.5 Кб, 33 просмотров)
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 15
26.10.2014, 20:52
как лучше сдеать, если считывать данные из txt? чтобы была иерархия именно..

при таком решении, иерархии нету.., а нужна..


private void Read_Click(object sender, EventArgs e)
{
//string[] lines = System.IO.File.ReadAllLines(@"C:\Users\A nna\Desktop\treevieww\1.txt");
string lines = System.IO.File.ReadAllText(@"D:\C#\treev ieww\1.txt");
string[] split = lines.Split(new Char[] { ';', '\t' });

foreach (string s in split)
{
if ((s.Trim() != "") && (s.Trim() != ";"))
treeView1.Nodes.Add(s);


}

если текстовый файл такой:



;1;Департамент по драгоценным металлам
1;3;Отдел договоров
1;17;Бухгалтерия
1;29;Планово-экономический отдел
1;30;Отдел расчета с поставщиками
1;27;Государственная лаборатория химического аналирования
27;13;Лаборатория ЦПСО
1;2;Центр переработки серебросодержащих отходов
1;14;Центр первичной переработки
1;23;Центр глубокой химической переработки
2;8;Участок приемки ЦПСО
2;9;Склад ЦПСО
2;18;Цех ЦПСО
2;26;Участок обогащения БНТУ
2;2000002;Участок сжигания ЦПСО (Витебск)
8;21;Участок приемки ЦПСО (Гомель)
8;5000002;Участок приемки ЦПСО (Минск)
14;15;Участок приемки ЦПП
14;28;Склад ЦПП
23;31;Участок приемки и опробирования ЦГХП
;351;Департамент по ценным бумагам
351;352;Отдел внутреннего обращения ценых бумаг
351;353;Отдел вторичного размещения ценых бумаг
351;354;Комитет по ценообразованию
;4071;Департамент финансов и бухгалтерского учета
4071;4072;Управление бюджетного финансирования
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2014, 20:52
Помогаю со студенческими работами здесь

Из List<string> в XDocument XML
Всем добрый день! Дан xml с настройками вида: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;dictionary&gt; &lt;el1&gt; ...

Чтение XML через JavaScript
Как считать етот файл с помощю JavaScript? &lt;&lt;?xml version=&quot;1.0&quot;?&gt; &lt;root&gt; &lt;Kilkist count=&quot;3&quot;&gt; &lt;Telefon ekran=&quot;176x208&quot;...

Чтение XML через XmlDocument
Всем привет. Для чтения XML использую XmlDocument. Получается пройтись по узлам корневого тега и до их дочерних тегов, а вот как дальше...

Формирование TreeView
Народ, помогите доделать, есть код который добавляет новый узел/подузел. var s : String; pz, i : Integer; tn0, tn1, tnf :...

TreeView и формирование боковой панели
Добрый день! На скриншоте использование TreeView1. При переходе по узлам TreeView1 закрываются и открываются новые элементы на панели...


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

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

Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru