2014-10-06 2 views
1

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

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-DEC
-BOONE
--- ТЕСТ
--- TEST1

ответ

1

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

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

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

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

Спасибо у о, Джон. Идентификатор уникален - я скопировал/вставил второй тестовый узел, например, и забыл изменить его. Я собираюсь покинуть офис, поэтому мне придется протестировать это сегодня вечером, когда я вернусь домой, но на первый взгляд это выглядит очень ясно, прямолинейно и (надеюсь) именно то, что мне нужно. – Boone

+0

Кажется, что каждый родитель создан до дочернего узла, поэтому вам не нужен второй (и внутренний) цикл foreach. Используйте ParentId элемента, чтобы получить узел родителя. Отредактированный пост, так как не хотел копировать сериализацию. –

+0

При условии, что это предположение верно для всех данных, тогда да. –