Форматирование родительских и дочерних узлов Treeview, который заполняется XML-файлом

Я очень плохо знаком с xml, таким образом, я надеюсь, что не задаю глупого вопроса здесь. Я в настоящее время работаю над заполнением treeview от XML-файла, который иерархически не структурирован. В XML-файле, что мне дали дочерние и родительские узлы, определяются в атрибутах элемента объекта. Как я смог бы использовать атрибуты для treeview для заполнения в правильной иерархии. (Примером Mary Jane должен быть дочерний узел Peter Smith). В настоящее время все имена находятся под друг другом.

корень

<item parent_id="0" id="1"><content><name>Peter Smith</name></content></item>
<item parent_id="1" id="2"><content><name>Mary Jane</name></content></item>
<item parent_id="1" id="7"><content><name>Lucy Lu</name></content></item>
<item parent_id="2" id="3"><content><name>Informatics Team</name></content></item>
<item parent_id="3" id="4"><content><name>Sandy Chu</name></content></item>
<item parent_id="4" id="5"><content><name>John Smith</name></content></item>
<item parent_id="5" id="6"><content><name>Jane Smith</name></content></item>

/ корень

Спасибо за всю Вашу справку, Marina

1
задан Deduplicator 10 February 2015 в 22:38
поделиться

2 ответа

Вот решение, использующее Linq to XML:

    string strXML = @"<root>
        <item parent_id='0' id='1'><content><name>Peter Smith</name></content></item>
        <item parent_id='1' id='2'><content><name>Mary Jane</name></content></item>
        <item parent_id='1' id='7'><content><name>Lucy Lu</name></content></item>
        <item parent_id='2' id='3'><content><name>Informatics Team</name></content></item>
        <item parent_id='3' id='4'><content><name>Sandy Chu</name></content></item>
        <item parent_id='4' id='5'><content><name>John Smith</name></content></item>
        <item parent_id='5' id='6'><content><name>Jane Smith</name></content></item>
        </root>";

    XDocument xDoc = XDocument.Parse(strXML, LoadOptions.None);

    var objData = xDoc.Root.Elements("item").ToList().Select(item =>
        new { id = item.Attribute("id").Value,
              pid = item.Attribute("parent_id").Value,
              tn = new TreeNode(item.Element("content").Element("name").Value)
        }).ToList();

    objData.ForEach(child =>
        {
            var parent = objData.FirstOrDefault(m => m.id == child.pid);
            if (parent != null)
                parent.tn.Nodes.Add(child.tn);
        });
    // Add all nodes with no parent to the TreeView's root:
    objData.Where(n => n.tn.Parent == null).ToList().ForEach(n => treeView1.Nodes.Add(n.tn));
2
ответ дан 3 September 2019 в 00:19
поделиться

Один из возможных алгоритмов: 1) Получить список узлов parent_id как уникальную коллекцию (не забудьте удалить дубликаты из всех коллекций)

2) Получить атрибуты id в коллекции

3) Создайте новую пустую коллекцию « parent »

4) Для каждого элемента в коллекции id , если соответствующий элемент существует в коллекции parent_id , то этот элемент является родителем некоторого другого элемента. Вы добавляете этот идентификатор в новую коллекцию родителей , которую вы создали

5) После того, как у вас есть список родителей, привяжите его к дереву. Это элементы вашего дерева верхнего уровня.

6) После этого вы можете снова пройти через коллекцию id и просто добавить каждый элемент к его родительскому элементу с помощью атрибута parent_id

Помните, что это не самая эффективная реализация, потому что вы повторяете несколько коллекций по раз вместо того, чтобы делать все за один проход (алгоритм, конечно, будет другим). Так что, если коллекции небольшие, то вышеперечисленное - хороший подход. Но если у вас есть десятки тысяч элементов, многократный просмотр коллекций может отрицательно сказаться на производительности. Но такой подход легко и быстро реализовать. Так что имейте в виду компромисс.

Также, поскольку вы только читаете XML, а не манипулируете им, предпочтите класс XMLReader классу XMLDocument .

0
ответ дан 3 September 2019 в 00:19
поделиться
Другие вопросы по тегам:

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