2010-02-19 5 views
5

Đây là tập tin XMLLàm thế nào để tạo treeview từ tệp XML bằng cách sử dụng 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> 

Từ đó, tôi muốn tạo một TreeView trong WPF và trông giống như

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

Vì vậy, hãy giúp tôi để tạo treeview này.

Trả lời

-1

Bạn có thể đọc về here rằng, một ví dụ từ trang web đó:

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

Điều đó sẽ dẫn đến này

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

Vì vậy, trong trường hợp của bạn, bạn cần phải thêm một số TreeViewItems hơn và làm tổ họ lên một chút, chơi với các mã trên để có được kết quả mà bạn muốn!

+0

Bất kỳ của các giải pháp này làm việc cho bạn? –

+0

Câu hỏi là "Cách tạo treeview từ tệp XML" không lồng nhau bằng tay trong xaml –

0

Chào mừng bạn đến với stackoverflow, nếu bạn có thể đăng một số mẫu xml - nó sẽ giúp hình dung những gì bạn đang hướng tới. Tôi nghĩ bạn cần sử dụng 1 hoặc nhiều hơn HierarchicalDataTemplate.

Giả sử một tập tin xml gọi 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> 

Bạn có thể sử dụng XAML một cái gì đó tương tự như:

<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

Dưới đây là một cách để làm điều đó theo chương trình. Điều này được dựa trên 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; 
     } 
    } 
} 

Mã đằng sau sẽ tạo cây cho thông số của bạn. Đây là XAML

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

Xin chào, bạn đã bỏ lỡ dấu chấm phẩy tại "BuildNodes (childTreeNode, childElement)". :) – Zeiga

+0

Cảm ơn @Zeiga, tôi đã bỏ lỡ điều đó –

0

Tôi biết câu hỏi này đã được hỏi một vài tháng trước đây nhưng tôi không nghĩ rằng nó đã được trả lời một cách chính xác như tôi chạy vào cùng một vấn đề và không ai trong số những gợi ý giúp tôi giải quyết nó.

Dưới đây là một liên kết mà giải thích làm thế nào để cư một treeview từ một .xml sử dụng winforms:

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

tôi quản lý để thích ứng với nó để WPF như vậy để cư một TreeView sử dụng các thông tin trong một .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 
     } 
    } 

} 

Đây là phiên bản generic nhất cho mỗi cấu trúc xml. Ví dụ:

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

Sẽ tạo ra này: This how it looks