2010-02-19 3 views
5

Si tratta di file XMLCome creare una vista ad albero dal file XML usando WPF?

<Root> 
<RootNode name="CurrentDbName" value="DeltaTest Backup" DesiPath="E:\BuildBackups"> 
<ChildNode name="Application" value="App"> 
    <LeafNode name="Source" value="Source" SourcePath="E:\Alertv2" /> 
    <LeafNode name="Publish" value="Publish" SourcePath="C:\Alert_Source" /> 
    </ChildNode> 
<ChildNode name="Database" value="DB"> 
    <LeafNode name="Dev" value="Dev" SourcePath="C:\Kiran3" /> 
    <LeafNode name="Build" value="Build" SourcePath="C:\Kiran4" /> 
    </ChildNode> 
    </RootNode> </Root> 

Da questo, voglio creare una vista ad albero in WPF e si presenta come

-Root 
--DeltaTestBaclup 
    ---App 
    ----Source 
    ----Publish 
    ---Db 
    ----Dev 
    ----Build 

Quindi, per favore mi aiuti per creare questa TreeView.

risposta

-1

Si può leggere su che here, un esempio da quel sito:

<TreeView Margin="10,10,0,13" Name="TreeView1" HorizontalAlignment="Left" 
VerticalAlignment="Top" Width="194" Height="200"> 
    <TreeViewItem Header="Cold Drinks"> 
     <TreeViewItem Header="Coke"></TreeViewItem> 
     <TreeViewItem Header="Pepsi"></TreeViewItem> 
     <TreeViewItem Header="Orange Juice"></TreeViewItem> 
     <TreeViewItem Header="Milk"></TreeViewItem> 
     <TreeViewItem Header="Iced Tea"></TreeViewItem> 
     <TreeViewItem Header="Mango Shake"></TreeViewItem> 
    </TreeViewItem> 
</TreeView> 

Ciò si tradurrebbe in questo

alt text http://www.c-sharpcorner.com/UploadFile/mahesh/WPFTreeView08202008231544PM/Images/WPFTreeViewImg1.jpg

Quindi nel tuo caso è necessario aggiungere più TreeViewItems e annidale un po ', gioca con il codice sopra per ottenere il risultato che vuoi!

+0

Ognuna di queste soluzioni funziona per voi? –

+0

La domanda era "Come creare una vista ad albero da file XML" non annidata manualmente in xaml –

0

Benvenuti in StackOverflow, se potessi pubblicare qualche xml di esempio, sarebbe utile per visualizzare a cosa stai lavorando. Penso che sia necessario utilizzare 1 o più HierarchicalDataTemplate.

Ipotizzando un file XML chiamato data.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <item> 
     <DeltaTestBaclup>aaa</DeltaTestBaclup> 
     <App>bbb</App> 
     <Source>ccc</Source> 
     <Publish>ddd</Publish> 
    </item> 
    <item> 
     <DeltaTestBaclup>aaa</DeltaTestBaclup> 
     <App>bbb</App> 
     <Source>ccc</Source> 
     <Publish>ddd</Publish> 
    </item> 
</root> 

si potrebbe usare qualcosa simile a XAML:

<Grid> 
     <Grid.DataContext> 
      <XmlDataProvider Source="data.xml"></XmlDataProvider> 
     </Grid.DataContext> 
     <Grid.Resources> 
      <HierarchicalDataTemplate x:Key="ItemTemplate" DataType="item"> 
       <TextBlock> 
        <TextBlock Text="{Binding XPath=DeltaTestBaclup}" /> 
        <LineBreak></LineBreak> 
        <TextBlock Text="{Binding XPath=App}" /> 
        <LineBreak></LineBreak> 
        <TextBlock Text="{Binding XPath=Source}" /> 
        <LineBreak></LineBreak> 
        <TextBlock Text="{Binding XPath=Publish}" />      
       </TextBlock> 
      </HierarchicalDataTemplate> 
     </Grid.Resources> 

     <TreeView Name="treeView" 
        ItemsSource="{Binding Path=.,XPath=/root/item}" 
        ItemTemplate="{StaticResource ItemTemplate}">  
     </TreeView> 
    </Grid> 
2

Ecco un modo per farlo a livello di codice. Questo si basa su this website's solution

public YourWindow() 
{ 
    InitializeComponent(); 
    BuildTree(treeView, XDocument.Load(System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"testxml.xml"))); 
} 

private void BuildTree(TreeView treeView, XDocument doc) 
{ 
    TreeViewItem treeNode = new TreeViewItem 
    { 
     //Should be Root 
     Header = doc.Root.Name.LocalName, 
     IsExpanded = true 
    }; 
    treeView.Items.Add(treeNode); 
    BuildNodes(treeNode, doc.Root); 
} 

private void BuildNodes(TreeViewItem treeNode, XElement element) 
{ 
    foreach (XNode child in element.Nodes()) 
    { 
     switch (child.NodeType) 
     { 
      case XmlNodeType.Element: 
       XElement childElement = child as XElement; 
       TreeViewItem childTreeNode = new TreeViewItem 
       { 
        //Get First attribute where it is equal to value 
        Header = childElement.Attributes().First(s => s.Name == "value").Value , 
        //Automatically expand elements 
        IsExpanded = true 
       }; 
       treeNode.Items.Add(childTreeNode); 
       BuildNodes(childTreeNode, childElement); 
       break; 
      case XmlNodeType.Text: 
       XText childText = child as XText; 
       treeNode.Items.Add(new TreeViewItem { Header = childText.Value, }); 
       break; 
     } 
    } 
} 

Questo codice dietro costruirà l'albero per il vostro spec. Questo è il codice XAML

<Grid> 
    <TreeView Margin="20" Background="LightGray" x:Name="treeView" /> 
</Grid> 
+1

Ehi, hai perso un punto e virgola in "BuildNodes (childTreeNode, childElement)". :) – Zeiga

+0

Grazie a @Zeiga, mi sono perso –

0

So che questa domanda è stato chiesto un paio di mesi fa, ma non credo che è stato risposto con precisione come ho incontrato lo stesso problema e nessuno di questi suggerimenti mi ha aiutato a risolverlo.

Ecco un link che spiega come popolare un controllo TreeView da un XML utilizzando WinForms:

http://www.codeproject.com/Articles/12606/Loading-and-Saving-XML-to-and-from-a-TreeView-Cont

sono riuscito ad adattarsi a WPF modo per popolare un controllo TreeView utilizzando le informazioni in XML:

//First, we'll load the Xml document 
XmlDocument xDoc = new XmlDocument(); 
xDoc.Load(filename); 

//Now, clear out the treeview, 
treeView.Items.Clear(); 

//and add the first (root) node 
TreeViewItem treeviewItemRoot = new TreeViewItem(); 
treeviewItemRoot.Header   = "Root"; 

treeView.Items.Add(treeviewItemRoot); 

TreeViewItem tNode = new TreeViewItem(); 
tNode = (TreeViewItem)treeView.Items[0]; 

//We make a call to addTreeNode, 
//where we'll add all of our nodes 
addTreeNode(xDoc.DocumentElement, tNode); 



//This function is called recursively until all nodes are loaded 
private void addTreeNode(XmlNode xmlNode, TreeViewItem treeNode) 
{ 
    XmlNode xNode; 
    TreeViewItem tNode; 
    XmlNodeList xNodeList; 
    if (xmlNode.HasChildNodes) //The current node has children 
    { 
     xNodeList = xmlNode.ChildNodes; 
     for (int x = 0; x <= xNodeList.Count - 1; x++) 
     //Loop through the child nodes 
     { 
      xNode = xmlNode.ChildNodes[x]; 

      treeNode.Items.Add(new TreeViewItem()); 
      tNode = treeNode.Items[x] as TreeViewItem; 
      addTreeNode(xNode, tNode); 
     } 
    } 
    else //No children, so add the outer xml (trimming off whitespace) 
     treeNode.Header = xmlNode.OuterXml.Trim(); 
} 
0
class Mapper 
{ 
    private string sourceXmlFile; 
    private XDocument xmlData; 

    public Mapper(string xmlFilePath) 
    {    
     sourceXmlFile = xmlFilePath;   
    } 

    private void BuildNodes(TreeViewItem treeNode, XElement element) 
    { 

     string attributes = ""; 
     if (element.HasAttributes) 
     { 
      foreach (var att in element.Attributes()) 
      { 
       attributes += " " + att.Name + " = " + att.Value; 
      } 
     } 

     TreeViewItem childTreeNode = new TreeViewItem 
     { 
      Header = element.Name.LocalName + attributes, 
      IsExpanded = true 
     }; 
     if (element.HasElements) 
     { 
      foreach (XElement childElement in element.Elements()) 
      { 
       BuildNodes(childTreeNode, childElement); 
      } 
     } 
     else 
     { 
      TreeViewItem childTreeNodeText = new TreeViewItem 
      { 
       Header = element.Value, 
       IsExpanded = true 
      }; 
      childTreeNode.Items.Add(childTreeNodeText);      
     } 

     treeNode.Items.Add(childTreeNode); 
    } 



    public void LoadXml(TreeView treeview) 
    { 
     try 
     { 
      if (sourceXmlFile != null) 
      { 
       xmlData = XDocument.Load(sourceXmlFile, LoadOptions.None); 
       if (xmlData == null) 
       { 
        throw new XmlException("Cannot load Xml document from file : " + sourceXmlFile); 
       } 
       else 
       { 
        TreeViewItem treeNode = new TreeViewItem 
        { 
         Header = sourceXmlFile, 
         IsExpanded = true 
        }; 


        BuildNodes(treeNode, xmlData.Root); 
        treeview.Items.Add(treeNode); 
       } 
      } 
      else 
      { 
       throw new IOException("Xml file is not set correctly."); 
      } 
     } 
     catch (IOException ioex) 
     { 
      //log 
     } 
     catch (XmlException xmlex) 
     { 
      //log 
     } 
     catch (Exception ex) 
     { 
      //log 
     } 
    } 

} 

Questa è la versione più generica per ogni struttura XML. Per esempio:

<Catalog> 
    <Book id="bk101"> 
     <Author>Garcia, Debra</Author> 
    <Title id="33">XML Developer's Guide</Title> 
    <Genre>Computer</Genre> 
    <Price>44.95</Price> 
    <PublishDate>2000-10-01</PublishDate> 
    <Description>An in-depth look at creating applications 
     with XML.</Description> 
    </Book> 
    <Book id="bk102"> 
    <Author>Garcia, Debra</Author> 
    <Title>Midnight Rain</Title> 
    <Genre>Fantasy</Genre> 
    <Price>5.95</Price> 
    <PublishDate>2000-12-16</PublishDate> 
    <Description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</Description> 
    </Book> 
</Catalog> 

produrrà questo: This how it looks