2010-02-19 25 views
5

Este es el archivo XML¿Cómo crear treeview desde un archivo 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> 

partir de esto, quiero crear una vista de árbol en WPF y se parece a

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

Así que por favor me ayude para crear esta vista de árbol.

Respuesta

-1

Usted puede leer acerca de que here, un ejemplo de ese sitio:

<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> 

que resultaría en este

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

Así que en su caso es necesario agregar algunos más TreeViewItems y anímalos un poco, juega con el código anterior para obtener el resultado que deseas!

+0

Cualquiera de estas soluciones funciona para usted? –

+0

pregunta era "¿Cómo crear vista de árbol del archivo XML" no anidando manualmente en XAML –

0

Bienvenido a Stackoverflow, si usted podría publicar algunos XML de ejemplo - que ayudaría a visualizar lo que su trabajo hacia. Creo que necesitas usar 1 o más HierarchicalDataTemplate.

Suponiendo un archivo XML denominado 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> 

usted podría utilizar xaml algo similar a:

<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

Aquí es una manera de hacerlo mediante programación. Esto se basa en 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; 
     } 
    } 
} 

Ese código detrás va a construir el árbol a su especificación. Este es el XAML

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

Hey, se ha perdido un punto y coma al "BuildNodes (childTreeNode, childElement)". :) – Zeiga

+0

Gracias @Zeiga, extrañé eso –

0

Sé que esta pregunta se hizo hace unos meses, pero no creo que fue respondida con precisión como me encontré con el mismo problema y ninguna de estas sugerencias que me ayudó a resolver.

Aquí hay un enlace que explica cómo llenar un TreeView desde una .xml utilizando Windows Forms:

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

me las arreglé para adaptarlo a WPF manera para llenar un TreeView utilizando la información en un .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 
     } 
    } 

} 

Esta es la versión más genérico para todas las estructuras XML. Por ejemplo:

<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> 

producirá esto: This how it looks