Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/121: Рейтинг темы: голосов - 121, средняя оценка - 4.64
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
1

Построить дерево

09.09.2016, 10:44. Показов 22699. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Не могу построить дерево, пример найти не удаётся, одни примеры постройки бинарных деревьев.
а мне нужно дерево вида (приложил картинку).

Начальные данные.
Есть список объектов класса connection, в классе connection есть поля : РодительскийОбъект , Объект

вот пример нескольких объектов списка класса connection

connection0 поля : РодительскийОбъект null, Объект A.
connection1 поля : РодительскийОбъект A, Объект QW.
connection2 поля : РодительскийОбъект null, Объект B.
connection3 поля : РодительскийОбъект A, Объект RT.
connection4 поля : РодительскийОбъект A, Объект YU.
connection5 поля : РодительскийОбъект B, Объект IO.


и так далее

Помогите построить дерево. по этим данным списка объектов класса connection.
Где нужно добавить поле "номер в иерархии".

Пример с номером на изображении.
Миниатюры
Построить дерево  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2016, 10:44
Ответы с готовыми решениями:

Построить двоичное дерево
1)Построить двоичное дерево и вывести его на экран (вывод на экран идет с корня, ниже наследники)...

Построить бинарное дерево
Люди, помогите построить бинарное дерево! У меня есть файл с 5 параметрами (модель машины ,тип,...

Получить уровень каждого объекта в списке (построить дерево?)
Имеется класс примерно такого вида: public class Item { public string ID { get;...

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

26
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
09.09.2016, 12:38  [ТС] 2
help me
0
Заблокирован
09.09.2016, 13:21 3
объект должен содержать массив объектов
C#
1
MyObj[] child=new MyObj[0];
и если увидел своего прямого потомка, то
C#
1
Array.Resize(ref child,child.Length+1);
если это внук/правнук, то пошли искать у сыновей...дочерей, ИМХО
0
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
09.09.2016, 13:24  [ТС] 4
MansMI, ты наверное не понял темы моей проблемы, хочу, чтобы на примере, продемонстрировали мне, как можно построить дерево сложно иерархическое, из списка данных.
C#
1
List <connection> data;
0
6269 / 2507 / 739
Регистрация: 11.04.2015
Сообщений: 4,044
Записей в блоге: 43
09.09.2016, 14:17 5
UseMuse, вообще-то тебе совершенно справедливо подсказали, что для построения дерева нужно, чтобы было из чего его строить. То есть нужно создать узел дерева, который будет иметь свойство, представляющее из себя коллекцию таких же узлов. Массивы тут использовать - не лучшая идея, но принцип описан верно. Очень упрощенно:
Класс Connection, представляющий узел дерева
C#
1
2
3
4
5
6
    public class Connection
    {
        public Connection Parent { get; set; }
        public String Name { get; set; }
        public IEnumerable<Connection> Children { get; set; }
    }
Предполагается, что у тебя имеется коллекция таких узлов и из них и нужно построить дерево. Создаем вот такой метод
C#
1
2
3
4
5
       void BuildTree(Connection con, IEnumerable<Connection> connectionList)
        {
            con.Children = connectionList.Where(c => c.Parent == con);
            foreach (Connection c in con.Children) BuildTree(c, connectionList);
        }
Далее, извлекаем из коллекции элемент, у которого Parent = null, и передаем его этому методу как первый аргумент, а вторым будет коллекция элементов.
Пример имеет скорее схематический характер, но дерево, в принципе, должно получиться.
1
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
09.09.2016, 23:55 6
В чем проблема то в обходе?
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
using System;
using System.Collections.Generic;
using System.Diagnostics;
 
namespace ConsoleApplication309
{
    internal class Program
    {
        private static void Main()
        {
            var root = new Connection<int>
            {
                Data = 1,
                Childs = new List<Connection<int>>
                {
                    new Connection<int>
                    {
                        Data = 2,
                        Childs = new List<Connection<int>>
                        {
                            new Connection<int> {Data = 4}
                        }
                    },
                    new Connection<int> {Data = 3}
                }
            };
 
 
            Walk(root, Console.WriteLine);
 
            Debugger.Break();
        }
 
        private static void Walk<T>(Connection<T> root, Action<T> action)
        {
            if (root == null) return;
            action(root.Data);
            root.Childs.ForEach(n => Walk(n, action));
        }
    }
 
    internal class Connection<T>
    {
        public T Data { get; set; }
        public IEnumerable<Connection<T>> Childs { get; set; }
    }
 
    internal static class ExEnumerable
    {
        public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
        {
            if (action == null) throw new ArgumentNullException(nameof(action));
            if (source == null) return;
            foreach (var element in source)
            {
                action(element);
            }
        }
    }
}
1
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
10.09.2016, 21:25  [ТС] 7
diadiavova, _exp10der_, MansMI, kolorotur,
Коллеги, не будьте равнодушными, гляньте пжлст на моё дерево, мне кажется, что я что-то не так делаю)
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
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
 
namespace ConsoleApplication8
{
    class Data
    {
        public string Parent { get; }
        public string CurrentObject { get; }
        public Data(string Parent, string CurrentObject)
        {
            this.Parent = Parent;
            this.CurrentObject = CurrentObject;
        }
    }
    public class Connection
    {
        public Connection(string objects, string p)
        {
            ParentString  = p ;
            Object = objects;
            Children = new List<Connection>();
            ChildrenString = new List<string>();
        }
        public Connection Parent { get; set; }
        public string ParentString { get; set; }
        public String Object { get; set; }
        public List<Connection> Children { get; set; }
        public List<string> ChildrenString { get; set; }
    }
    class Program
    {
        static void BuildTree(Connection con, List<Connection> connectionList)
        {
            con.Children.AddRange(connectionList.Where(c => c.Parent == con));
            foreach (Connection c in con.Children) BuildTree(c, connectionList);
        }
        static void Show(Connection con)
        {
            Console.WriteLine(con.ParentString + " - " + con.Object);
            foreach (var i in con.Children)
            {
                Show(i);
            }
        }
        static void Main(string[] args)
        {
            List<Data> data = new List<Data>();
            data.Add(new Data("Root", "A"));
            data.Add(new Data("A", "QW"));
            data.Add(new Data("Root", "B"));
            data.Add(new Data("A", "RT"));
            data.Add(new Data("A", "YU"));
            data.Add(new Data("A", "IO"));
            data.Add(new Data("RT", "RT2"));
            List<Connection> connections = new List<Connection>();
 
            Connection root = new Connection("Root", "");
            connections.Add(root);
            foreach (var item in data)
            {
             //   Connection d = new Connection(item.CurrentObject, item.Parent);
                connections.Add(new Connection(item.CurrentObject, item.Parent));
            }
            BuildTree(root, connections);
            foreach (var i in connections)
            {
                Show(i);
            }
            Console.ReadKey();
        }
    }
}
0
6269 / 2507 / 739
Регистрация: 11.04.2015
Сообщений: 4,044
Записей в блоге: 43
10.09.2016, 22:33 8
Лучший ответ Сообщение было отмечено UseMuse как решение

Решение

UseMuse, у тебя Parent не инициирован и родительский узел определяется его именем. Поэтому код построения видимо будет выглядеть так
C#
1
2
3
4
5
            static void BuildTree(Connection con, List<Connection> connectionList)
            {
                con.Children.AddRange(connectionList.Where(c => c.ParentString == con.Object));
                foreach (Connection c in con.Children) BuildTree(c, connectionList);
            }
Что касается свойства Parent, то его надо либо убрать, либо инициировать при построении дерева. Кстати, назначение свойства ChildrenString тоже не вполне ясно. Если уж очень надо, то можно сделать такое свойство
C#
1
2
3
4
5
6
7
            public IEnumerable<string> ChildrenString
            {
                get
                {
                    return this.Children.Select(c => c.Object);
                }
            }
В конструкторе, естественно, его инициировать не надо. Но в принципе это лишнее.
1
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
11.09.2016, 14:01  [ТС] 9
diadiavova,
Цитата Сообщение от diadiavova Посмотреть сообщение
у тебя Parent не инициирован и родительский узел определяется его именем.
Цитата Сообщение от diadiavova Посмотреть сообщение
Что касается свойства Parent, то его надо либо убрать, либо инициировать при построении дерева.
Можно на примере моего примера, как родительский узел определяется с помощью инициализации Parent, а не его именем.
0
6269 / 2507 / 739
Регистрация: 11.04.2015
Сообщений: 4,044
Записей в блоге: 43
11.09.2016, 14:08 10
Цитата Сообщение от UseMuse Посмотреть сообщение
Можно на примере, как родительский узел определяется с помощью инициализации Parent, а не его именем.
Здесь вопрос в том, когда и для чего тебе это надо. Можно сделать это во время построения дерева, вот так.
C#
1
2
3
4
5
6
        static void BuildTree(Connection con, List<Connection> connectionList)
        {
            con.Children.AddRange(connectionList.Where(c => c.ParentString == con.Object));
            con.Children.ForEach(c => c.Parent = con);
            foreach (Connection c in con.Children) BuildTree(c, connectionList);
        }
Но если тебе надо это свойство во время построения дерева уже использовать, то при создании объекта нужный объект придется искать в коллекции и смысла в этом мало.
1
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
11.09.2016, 14:26  [ТС] 11
Цитата Сообщение от diadiavova Посмотреть сообщение
Здесь вопрос в том, когда и для чего тебе это надо
Я данные получаю из xml, объект xml имеет атрибуты : Родитель, Дочерний.
Чтобы не замарачиваться с xml я создал коллекцию Data, которая получилась после сбора данных xml.
Нужно построить k-мерное дерево по этим данным.
Отобразить дерево в консоли.
Покажите пожалуйста, как бы вы решили данную задачу, если можно то не отрывками, а
Начиная с момента, когда вы имеете коллекцию Data, по которой нужно построить дерево.

Добавлено через 2 минуты
Цитата Сообщение от diadiavova Посмотреть сообщение
Можно сделать это во время построения дерева, вот так.
C#
1
2
3
4
5
6
* * * * static void BuildTree(Connection con, List<Connection> connectionList)
* * * * {
* * * * * * con.Children.AddRange(connectionList.Where(c => c.ParentString == con.Object));
* * * * * * con.Children.ForEach(c => c.Parent = con);
* * * * * * foreach (Connection c in con.Children) BuildTree(c, connectionList);
* * * * }
C#
1
 
В каком месте вызывать метод, и как построить дерево?)
0
6269 / 2507 / 739
Регистрация: 11.04.2015
Сообщений: 4,044
Записей в блоге: 43
11.09.2016, 14:33 12
Цитата Сообщение от UseMuse Посмотреть сообщение
Покажите пожалуйста, как бы вы решили данную задачу, если можно то не отрывками, а
Начиная с момента, когда вы имеете коллекцию Data, по которой нужно построить дерево.
Ну я бы изначально подошел к решению проблемы несколько иначе. Вот ты создал специальный класс для того, чтобы не заморачиваться с XML, а вот я бы наоборот возможности XML использовал бы по максимуму. В частности можно было бы использовать XSLT для приведения XML к виду, пригодному для десериализации, после чего дерево получил бы, десериализовав документ. Что касается твоего случая, то, насколько я могу судить, задача ведь решена уже. Что еще показывать-то?

Добавлено через 1 минуту
Цитата Сообщение от UseMuse Посмотреть сообщение
В каком месте вызывать метод, и как построить дерево?)
Что значит в каком месте? У тебя уже есть метод BuildTree, я в него просто еще одну строчку добавил.
1
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
11.09.2016, 14:53  [ТС] 13
diadiavova,
Цитата Сообщение от diadiavova Посмотреть сообщение
Что значит в каком месте? У тебя уже есть метод BuildTree, я в него просто еще одну строчку добавил.
проехали)
Цитата Сообщение от diadiavova Посмотреть сообщение
можно было бы использовать XSLT для приведения XML к виду, пригодному для десериализации, после чего дерево получил бы, десериализовав документ.
покажи пожалуйста, файл приложил
Вложения
Тип файла: zip Data.zip (319 байт, 7 просмотров)
0
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
11.09.2016, 14:56  [ТС] 14
diadiavova, тут буквально в файле данных для примера чисто, маленькое дерево. Научиться бы
0
6269 / 2507 / 739
Регистрация: 11.04.2015
Сообщений: 4,044
Записей в блоге: 43
11.09.2016, 16:18 15
UseMuse, писать полный пример - малость муторно. Но, чтобы было понятно о чем речь...
Для того, чтобы это дело освоить надо для начала разобраться с XML-сериализацией, здесь читай документацию по классу System.Xml.Serialization.XmlSerializer. Кроме того, надо уметь программно выполнять преобразование документа с помощью XSLT, для этого изучай документацию по System.Xml.Xsl.XsltCompiledTransform.
Ну и, соответственно, сам язык XSLT изучить придется.
Твой пример я малость подправил, чтобы там был только один корневой элемент. Реализовать задачу с несколькими корнями несложно и это не принципиально, просто в этом случае понадобиться десериализация в коллекцию корневых узлов. Теперь это выглядит так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<head>
        <Структура>
            <Объект НаименованиеОбъекта="А" НаименованиеОбъектаРодителя=""/>
            <Объект НаименованиеОбъекта="В" НаименованиеОбъектаРодителя="A"/>
            <Объект НаименованиеОбъекта="Г" НаименованиеОбъектаРодителя="B"/>
            <Объект НаименованиеОбъекта="Д" НаименованиеОбъектаРодителя="В"/>
            <Объект НаименованиеОбъекта="Е" НаименованиеОбъектаРодителя="В"/>
            <Объект НаименованиеОбъекта="Н" НаименованиеОбъектаРодителя="Д"/>
            <Объект НаименованиеОбъекта="К" НаименованиеОбъектаРодителя="Е"/>
            <Объект НаименованиеОбъекта="Й" НаименованиеОбъектаРодителя="Д"/>
            <Объект НаименованиеОбъекта="У" НаименованиеОбъектаРодителя="А"/>
            <Объект НаименованиеОбъекта="Г" НаименованиеОбъектаРодителя="А"/>
        </Структура>
</head>
Преобразование выглядит так
XML
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
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <xsl:apply-templates select="//Объект[@НаименованиеОбъектаРодителя = '']"/>
  </xsl:template>
 
  <xsl:template match="Объект">
    <Connection>
      <ParentString >
        <xsl:value-of select="@НаименованиеОбъектаРодителя"/>
      </ParentString>
      <Object>
        <xsl:value-of select="@НаименованиеОбъекта"/>
      </Object>
      <Children>
        <xsl:variable name="objname" select="@НаименованиеОбъекта"/>
        <xsl:apply-templates select="//Объект[@НаименованиеОбъектаРодителя = $objname]"/>
      </Children>
      <ChildrenString >
        <xsl:variable name="objname" select="@НаименованиеОбъекта"/>
        <xsl:for-each select="//Объект[@НаименованиеОбъектаРодителя = $objname]">
          <string>
            <xsl:value-of select="@НаименованиеОбъекта"/>
          </string>
        </xsl:for-each>
      </ChildrenString>
    </Connection>
  </xsl:template>
</xsl:stylesheet>
В результате этого преобразования получится вот такой документ
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<Connection>
  <ParentString></ParentString>
  <Object>А</Object>
  <Children>
    <Connection>
      <ParentString>А</ParentString>
      <Object>У</Object>
      <Children />
      <ChildrenString />
    </Connection>
    <Connection>
      <ParentString>А</ParentString>
      <Object>Г</Object>
      <Children />
      <ChildrenString />
    </Connection>
  </Children>
  <ChildrenString>
    <string>У</string>
    <string>Г</string>
  </ChildrenString>
</Connection>
И его уже вполне можно десериализовать.
1
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
11.09.2016, 16:34  [ТС] 16
diadiavova, Спасибо большое! Проект бы пощупать

Добавлено через 4 минуты
diadiavova,
Цитата Сообщение от diadiavova Посмотреть сообщение
вполне можно десериализовать.
с помощью объекта Stream или XmlReader?
0
6269 / 2507 / 739
Регистрация: 11.04.2015
Сообщений: 4,044
Записей в блоге: 43
11.09.2016, 16:37 17
В документе были нестыковки. То ли разные алфавиты использовались, то ли что еще, но дерево было неправильным. Вот в таком виде строится.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<head>
        <Структура>
            <Объект НаименованиеОбъекта="А" НаименованиеОбъектаРодителя=""/>
            <Объект НаименованиеОбъекта="В" НаименованиеОбъектаРодителя="А"/>
            <Объект НаименованиеОбъекта="Г" НаименованиеОбъектаРодителя="В"/>
            <Объект НаименованиеОбъекта="Д" НаименованиеОбъектаРодителя="В"/>
            <Объект НаименованиеОбъекта="Е" НаименованиеОбъектаРодителя="В"/>
            <Объект НаименованиеОбъекта="Н" НаименованиеОбъектаРодителя="Д"/>
            <Объект НаименованиеОбъекта="К" НаименованиеОбъектаРодителя="Е"/>
            <Объект НаименованиеОбъекта="Й" НаименованиеОбъектаРодителя="Д"/>
            <Объект НаименованиеОбъекта="У" НаименованиеОбъектаРодителя="А"/>
        </Структура>
</head>
Результат
XML
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
<?xml version="1.0" encoding="utf-8"?>
<Connection>
  <ParentString></ParentString>
  <Object>А</Object>
  <Children>
    <Connection>
      <ParentString>А</ParentString>
      <Object>В</Object>
      <Children>
        <Connection>
          <ParentString>В</ParentString>
          <Object>Г</Object>
          <Children />
          <ChildrenString />
        </Connection>
        <Connection>
          <ParentString>В</ParentString>
          <Object>Д</Object>
          <Children>
            <Connection>
              <ParentString>Д</ParentString>
              <Object>Н</Object>
              <Children />
              <ChildrenString />
            </Connection>
            <Connection>
              <ParentString>Д</ParentString>
              <Object>Й</Object>
              <Children />
              <ChildrenString />
            </Connection>
          </Children>
          <ChildrenString>
            <string>Н</string>
            <string>Й</string>
          </ChildrenString>
        </Connection>
        <Connection>
          <ParentString>В</ParentString>
          <Object>Е</Object>
          <Children>
            <Connection>
              <ParentString>Е</ParentString>
              <Object>К</Object>
              <Children />
              <ChildrenString />
            </Connection>
          </Children>
          <ChildrenString>
            <string>К</string>
          </ChildrenString>
        </Connection>
      </Children>
      <ChildrenString>
        <string>Г</string>
        <string>Д</string>
        <string>Е</string>
      </ChildrenString>
    </Connection>
    <Connection>
      <ParentString>А</ParentString>
      <Object>У</Object>
      <Children />
      <ChildrenString />
    </Connection>
  </Children>
  <ChildrenString>
    <string>В</string>
    <string>У</string>
  </ChildrenString>
</Connection>
Добавлено через 46 секунд
Цитата Сообщение от UseMuse Посмотреть сообщение
с помощью объекта Stream или XmlReader?
А какая разница? Работай с тем, с чем тебе удобнее.
0
6269 / 2507 / 739
Регистрация: 11.04.2015
Сообщений: 4,044
Записей в блоге: 43
11.09.2016, 16:56 18
Цитата Сообщение от UseMuse Посмотреть сообщение
Проект бы пощупать
Проект я приложил, там создается объект, но я не проверял что именно создается, это уже сам.
Вложения
Тип файла: zip ConsoleCS.zip (35.1 Кб, 23 просмотров)
1
162 / 150 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
11.09.2016, 17:28  [ТС] 19
diadiavova, Хочу отобразить преобразование в консоль, не пойму, в чем ошибка
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System.Xml.Linq;
using System.Xml.Xsl;
using System.IO;
using System.Xml;
 
namespace System.Reflection
{
    class Program
    {
        static private string _filePath;
        static private string _folderPath = @"C:\Users\User\Desktop\test";
 
         private const string FileName = "Data.xml";
 
        private static XName header_XName = XName.Get("head");
        private static XName Data_XName = XName.Get("Структура");
        private static XName Object_XName = XName.Get("Объект");
 
        static private string FilePath
        {
            get
            {
                if (_filePath== null)
                    _filePath= Path.Combine(FolderPath, FileName);
 
                return _filePath;
            }
            set
            {
                _filePath= value;
            }
        }
        static private string FolderPath
        {
            get
            {
                return _folderPath;
            }
        }
        /*
         Вы можете создавать XML-дерево, XmlReader из XML-дерева, новый документ и XmlWriter, 
         который будет заносить информацию в новый документ.После этого можно вызвать преобразование XSLT,
         передавая XmlReader и XmlWriter этой трансформации.После успешного завершения 
         преобразования новое XML-дерево заполняется ее результатами.
             */
        public static void Main()
        {
 
            string xslMarkup = @"<? xml version = '1.0' encoding = 'utf-8' ?>
   <xsl : stylesheet version = '1.0' xmlns: xsl = 'http://www.w3.org/1999/XSL/Transform'
    xmlns: msxsl = 'urn:schemas-microsoft-com:xslt' exclude - result - prefixes = 'msxsl'
  >
     <xsl:output method = 'xml' indent = 'yes'/>
        <xsl:template match = '/'>      
           <xsl:apply - templates select = '//Объект[@НаименованиеОбъектаРодителя = '']'/>  
            </xsl:template>
             <xsl:template match = 'Объект'>
                < Connection>
                  < ParentString>
                    <xsl:value - of select = '@НаименованиеОбъектаРодителя'/> 
                     </ParentString>  
                     < Object>
                       <xsl:value - of select = '@НаименованиеОбъекта'/>
                        </Object>
                        < Children>
                          <xsl:variable name = 'objname' select = '@НаименованиеОбъекта'/>
                             <xsl:apply - templates select = '//Объект[@НаименованиеОбъектаРодителя = $objname]'/>
                              </Children>
                              < ChildrenString>
                                <xsl:variable name = 'objname' select = '@НаименованиеОбъекта'/>
                                   <xsl:for-each select = '//Объект[@НаименованиеОбъектаРодителя = $objname]'>
                                      < string>
                                        <xsl:value - of select = '@НаименованиеОбъекта'/>
                                      </string>
                                    </xsl:for-each> 
                                   </ChildrenString>
                                 </Connection>
                               </xsl:template>
                             </xsl:stylesheet>";
 
            string Xml = File.ReadAllText(FilePath);//FilePath "возвращающий путь к файлу Data
            XDocument XDocument = XDocument.Parse(Xml);
            //XElement Header_XElement = import_XDocument.Root.Element(header_XName);
            // XElement Data_XElement = import_XDocument.Root.Element(Data_XName);
 
            if (Xml == null) return;
 
            Console.WriteLine(1);
     
 
            XDocument newTree = new XDocument();
            using (XmlWriter writer = newTree.CreateWriter())
            {
               //Load the style sheet.
                XslCompiledTransform xslt = new XslCompiledTransform();
                xslt.Load(XmlReader.Create(new StringReader(xslMarkup)));
 
               //Execute the transform and output the results to a writer.
                xslt.Transform(XDocument.CreateReader(), writer);
            }
            Console.WriteLine(newTree);
        }
    }
}
0
6269 / 2507 / 739
Регистрация: 11.04.2015
Сообщений: 4,044
Записей в блоге: 43
11.09.2016, 17:39 20
UseMuse, а зачем ты преобразование в код засунул? Так оно не будет работать, хотябы даже из-за кавычек. То, что ты заменил двойные кавычки одинарными - ровным счетом ничего не меняет, поскольку там в самом документе этот прием используется: в значениях атрибутов выражения XPath, содержащие кавычки, используют одинарные кавычки из-за того, что значение атрибута обрамляется двойными. Когда ты двойные кавычки заменяешь одинарными, они просто преждевременно закрываются(пример в 55-ой строке).
0
11.09.2016, 17:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2016, 17:39
Помогаю со студенческими работами здесь

Бинарное дерево: как происходит добавления элемента в дерево с двумя параметрами
Здравствуйте! Прошу помощи у опытных программистов...)))) Есть класс дерево: class class1 ...

Преобразовать идеальное бинарное дерево в бинарное дерево поиска
Всем привет, я создал идельное бинарное дерево и написал к нему функции. Как мне теперь можно...

Построить дерево
По текстовому файлу f построить дерево поиска T добавить новый элемент е проверить входит ли е в...

Построить дерево
написать процедуру creat(n,T), где n целое положительное число, T дерево, создающую дерево...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru