Как построить Treeview из XML?

1

Я пытаюсь заполнить Treeview, используя возвращаемые данные из вызова веб-службы. Я использовал Restsharp для вызова и возврата данных. Тем не менее, я действительно пытаюсь понять, как передать его в правильное дерево. Я пытался использовать это руководство CodeProject, но мне не удалось заставить его работать, и я создал беспорядок моего кода, пытаясь его адаптировать. Любая помощь или направление были бы весьма признательны.

XML возвращается как:

    <ListItems xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Items>
    <ListItem>
      <ID>n0z5tVQXsbTgB8PUp7tE5$p5shhQOV3s5Y</ID>
      <URI>https://URL/n0z5tVQXsbTgB8PUp7tE5$p5shhQOV3s5Y</URI>
      <ListID>nnK2NXzfmoCyTPE0yck44Nswy1Ho964Lo</ListID><Name>BATMAN</Name><ParentID xsi:nil="true" />
      <Level1Code>BATMAN</Level1Code><Level2Code xsi:nil="true" /><Level3Code xsi:nil="true" />
      <Level4Code xsi:nil="true" /><Level5Code xsi:nil="true" /><Level6Code xsi:nil="true" />
      <Level7Code xsi:nil="true" /><Level8Code xsi:nil="true" /><Level9Code xsi:nil="true" />
      <Level10Code xsi:nil="true" />
    </ListItem>
    <ListItem>
      <ID>n0z5tVQXsbTnByah$pfDj0gDjm$sMYSfFYB</ID>
      <URI>https://URL/n0z5tVQXsbTnByah$pfDj0gDjm$sMYSfFYB</URI>
      <ListID>nnK2NXzfmoCyTPE0yck44Nswy1Ho964Lo</ListID><Name>Rig Move Project Management</Name>
      <ParentID>n0z5tVQXsbTgB8PUp7tE5$p5shhQOV3s5Y</ParentID><Level1Code>BATMAN</Level1Code>
      <Level2Code>RMPM</Level2Code><Level3Code xsi:nil="true" /><Level4Code xsi:nil="true" />
      <Level5Code xsi:nil="true" /><Level6Code xsi:nil="true" /><Level7Code xsi:nil="true" />
      <Level8Code xsi:nil="true" /><Level9Code xsi:nil="true" /><Level10Code xsi:nil="true" />
    </ListItem>
    <ListItem>
      <ID>n0z5tVQXsbT76YjU9r5rbMbo526tKB7kT</ID>
      <URI>https://URL/n0z5tVQXsbT76YjU9r5rbMbo526tKB7kT</URI>
      <ListID>nnK2NXzfmoCyTPE0yck44Nswy1Ho964Lo</ListID><Name>14-RMPM-AUG</Name>
      <ParentID>n0z5tVQXsbTnByah$pfDj0gDjm$sMYSfFYB</ParentID><Level1Code>BATMAN</Level1Code>
      <Level2Code>RMPM</Level2Code><Level3Code>14-RMPM-AUG</Level3Code><Level4Code xsi:nil="true" />
      <Level5Code xsi:nil="true" /><Level6Code xsi:nil="true" /><Level7Code xsi:nil="true" />
      <Level8Code xsi:nil="true" /><Level9Code xsi:nil="true" /><Level10Code xsi:nil="true" />
    </ListItem>
    <ListItem>
      <ID>n0z5tVQXsbT98mCa24ijg8oKVUXUu9voE</ID>
      <URI>https://URL/n0z5tVQXsbT98mCa24ijg8oKVUXUu9voE</URI>
      <ListID>nnK2NXzfmoCyTPE0yck44Nswy1Ho964Lo</ListID><Name>14-RMPM-SEP</Name>
      <ParentID>n0z5tVQXsbTnByah$pfDj0gDjm$sMYSfFYB</ParentID><Level1Code>BATMAN</Level1Code>
      <Level2Code>RMPM</Level2Code><Level3Code>14-RMPM-SEP</Level3Code><Level4Code xsi:nil="true" />
      <Level5Code xsi:nil="true" /><Level6Code xsi:nil="true" /><Level7Code xsi:nil="true" />
      <Level8Code xsi:nil="true" /><Level9Code xsi:nil="true" /><Level10Code xsi:nil="true" />
    </ListItem>
    <ListItem>
      <ID>n0z5tVQXsbTzkVY2DmlIKqTJQ$ssiU$sZhq</ID>
      <URI>https://URL/n0z5tVQXsbTzkVY2DmlIKqTJQ$ssiU$sZhq</URI>
      <ListID>nnK2NXzfmoCyTPE0yck44Nswy1Ho964Lo</ListID><Name>14-RMPM-DEC</Name>
      <ParentID>n0z5tVQXsbTnByah$pfDj0gDjm$sMYSfFYB</ParentID><Level1Code>BATMAN</Level1Code>
      <Level2Code>RMPM</Level2Code><Level3Code>14-RMPM-DEC</Level3Code><Level4Code xsi:nil="true" />
      <Level5Code xsi:nil="true" /><Level6Code xsi:nil="true" /><Level7Code xsi:nil="true" />
      <Level8Code xsi:nil="true" /><Level9Code xsi:nil="true" /><Level10Code xsi:nil="true" />
    </ListItem>
    <ListItem>
      <ID>n0z5tVQXsbT3akVrmqiTRzuqyw4bvZhNj</ID>
      <URI>https://URL/n0z5tVQXsbT3akVrmqiTRzuqyw4bvZhNj</URI>
      <ListID>nnK2NXzfmoCyTPE0yck44Nswy1Ho964Lo</ListID><Name>BOONE</Name><ParentID xsi:nil="true" />
      <Level1Code>BOONE</Level1Code><Level2Code xsi:nil="true" /><Level3Code xsi:nil="true" />
      <Level4Code xsi:nil="true" /><Level5Code xsi:nil="true" /><Level6Code xsi:nil="true" />
      <Level7Code xsi:nil="true" /><Level8Code xsi:nil="true" /><Level9Code xsi:nil="true" />
      <Level10Code xsi:nil="true" />
    </ListItem>
    <ListItem>
      <ID>n0z5tVQXsbTJzA$pdmVRdjjTNL8ZgV2CtV</ID>
      <URI>https://URL/n0z5tVQXsbTJzA$pdmVRdjjTNL8ZgV2CtV</URI>
      <ListID>nnK2NXzfmoCyTPE0yck44Nswy1Ho964Lo</ListID><Name>TEST</Name>
      <ParentID>n0z5tVQXsbT3akVrmqiTRzuqyw4bvZhNj</ParentID><Level1Code>BOONE</Level1Code><Level2Code>TEST</Level2Code>
      <Level3Code xsi:nil="true" /><Level4Code xsi:nil="true" /><Level5Code xsi:nil="true" />
      <Level6Code xsi:nil="true" /><Level7Code xsi:nil="true" /><Level8Code xsi:nil="true" />
      <Level9Code xsi:nil="true" /><Level10Code xsi:nil="true" />
    </ListItem>
    <ListItem>
      <ID>n0z5tVQXsbTJzA$pdmVRdjjTNL8ZgV2CtV</ID>
      <URI>https://URL/n0z5tVQXsbTJzA$pdmVRdjjTNL8ZgV2CtV</URI>
      <ListID>nnK2NXzfmoCyTPE0yck44Nswy1Ho964Lo</ListID><Name>TEST1</Name>
      <ParentID>n0z5tVQXsbT3akVrmqiTRzuqyw4bvZhNj</ParentID><Level1Code>BOONE</Level1Code><Level2Code>TEST1</Level2Code>
      <Level3Code xsi:nil="true" /><Level4Code xsi:nil="true" /><Level5Code xsi:nil="true" />
      <Level6Code xsi:nil="true" /><Level7Code xsi:nil="true" /><Level8Code xsi:nil="true" />
      <Level9Code xsi:nil="true" /><Level10Code xsi:nil="true" />
    </ListItem>
  </Items>
  <NextPage xsi:nil="true" />
</ListItems>

Так что это должно получиться:

-BATMAN
---RMPM
------ 14-RMPM-август
------ 14-RMPM-сентябрь
------ 14-RMPM-декабрь
-BOONE
---TEST
---TEST 1

Теги:
treeview
restsharp

1 ответ

1
Лучший ответ

То, что я сделал, это взять ваш xml и использовать функцию " Paste Special → Paste XML As Class для VS 2013, чтобы создать класс из XML. Затем я использую XML-сериализатор для десериализации XML в объект, который я могу использовать. Затем я создал узлы дерева для каждого из элементов и создал соответствующую структуру и добавил корни в Tree View.

Он делает несколько предположений:

  • Идентификатор уникален (мне пришлось массировать второй тестовый узел для этого)
  • Имя - это то, что вы хотите использовать для текста дерева
  • Родительский узел создается до того, как дочерний узел

string xml = ""; // Your big XML string
StringReader sr = new StringReader(xml);
XmlSerializer xs = new XmlSerializer(typeof(ListItems));
ListItems listItems = (ListItems)xs.Deserialize(sr);
Dictionary<string, TreeNode> nodes = new Dictionary<string, TreeNode>();

foreach (var item in listItems.Items)
{
    TreeNode node;
    nodes.Add(item.ID, node = new TreeNode(item.Name));
    if (item.ParentId != null)
        nodes[item.ParentId].Nodes.Add(node);
    else
        treeView1.Nodes.Add(node);
}
/* Edited this out, can do in only one loop
foreach (var item in listItems.Items)
{
    var children = from i in listItems.Items where i.ParentID == item.ID select i;

    foreach (var child in children)
    {
        nodes[item.ID].Nodes.Add(nodes[child.ID]);
    }

    if (item.ParentID==null)
        treeView1.Nodes.Add(nodes[item.ID]);
}
*/
  • 0
    Спасибо, Джон. Идентификатор уникален - я скопировал / вставил второй тестовый узел просто для примера и забыл изменить это. Я собираюсь покинуть офис, поэтому мне придется проверить это сегодня вечером, когда я вернусь домой, но на первый взгляд это выглядит очень четко, просто и (надеюсь) именно то, что мне нужно.
  • 0
    Похоже, что каждый родительский элемент создается перед дочерним узлом, поэтому вам не нужен второй (и внутренний) цикл foreach . Используйте ParentId элемента, чтобы получить узел родителя. Отредактированный пост, так как не хотел копировать вашу сериализацию.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню