如何将多个XML文件绑定到TreeView c#WPF

时间:2016-12-23 09:22:23

标签: c# xml wpf treeview

我有一个文件夹,并包含多个文件夹,每个文件夹都有一个名为Package的xml文件。 我想创建一个树视图。 所以必须看看Treeview enter image description here

XML frist文件结构:



<?xml version="1.0" encoding="utf-8"?>
    <Package xmlns="......................">
  <Objects>
    <Object Type="Package" Description="Projekte">Dokumentation</Object>
    <Object Type="File" Description="Globale Variablen">Global_Variables.var</Object>
    <Object Type="File" Description="Schrittmotoren,Wechselrichter">Global_Stepper.var</Object>
    <Object Type="Library" Language="IEC" Description="Allgemeine Konstanten">BIB_Const</Object>
    <Object Type="Library" Language="IEC">BIB_Global</Object>
    <Object Type="Program" Language="IEC" Description="Programm">PRG_Main</Object>
    <Object Type="Package" Description="Mapping">Mapping</Object>
    <Object Type="Package" Description="Projekte">Projekte</Object>
     </Objects>
</Package>
&#13;
&#13;
&#13; XML第二文件结构:
&#13;
&#13;
<?xml version="1.0" encoding="utf-8"?>
   
<Package xmlns=...............">
  <Objects>
    <Object Type="File">TODO.TXT</Object>
    <Object Type="File">Abkuerzungen.txt</Object>
    <Object Type="File">Wissenswertes.docx</Object>
    <Object Type="File">OffenePunkte.xlsx</Object>
    <Object Type="File">FB_Drive_test_hochformat.pptm</Object>
    <Object Type="File">FB_Drive_test_querformat.pptm</Object>
    <Object Type="File">Offene Stellen HMI - Dennis.docx</Object>
    <Object Type="File">Offene-Punkte-BA10472.xls</Object>
    <Object Type="File">FragenZuStandardisierung_Bereich_AlarmeMeldungen.doc</Object>
    <Object Type="File">Wichtige Tracewerte.xls</Object>
  </Objects>
</Package>
&#13;
&#13;
&#13;

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace TreeView_Test
{

    public partial class MainWindow : Window
    {
        private TreeViewItem tree; // TreeViewItem reference
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            // Erstelt, Xmlauslesen Einstellung und
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreWhitespace = true;


            XmlReader reader = XmlReader.Create(@"C.....Package.PKG", settings);
           // XmlReader reader1 = XmlReader.Create("XML2.PKG", settings);
            tree = new TreeViewItem(); // instantiate TreeViewItem

            tree.Header = "Projekt"; // assign name to TreeViewItem        
            xmlTreeView.Items.Add(tree); // add TreeViewItem to TreeView  
            BuildTree(reader, tree); // build node and tree hierarchy
           // BuildTree(reader1, tree);
        }


        private void BuildTree(XmlReader reader, TreeViewItem TreeViewItem)
        {
            // TreeViewItem to add to existing tree
            TreeViewItem newNode = new TreeViewItem();

            while (reader.Read())
            {
                // build tree based on node type
                switch (reader.NodeType)
                {
                    // if Text node, add its value to tree
                    case XmlNodeType.Text:
                        newNode.Header = reader.Value;
                        TreeViewItem.Items.Add(newNode);


                        break;
                    case XmlNodeType.EndElement: // if EndElement, move up tree
                        TreeViewItem = (TreeViewItem)TreeViewItem.Parent;


                        break;

                    // if new element, add name and traverse tree
                    case XmlNodeType.Element:

                        // determine if element contains content
                        if (!reader.IsEmptyElement)
                        {
                            // assign node text, add newNode as child
                            newNode.Header = reader.Name;
                            TreeViewItem.Items.Add(newNode);

                            // set TreeViewItem to last child
                            TreeViewItem = newNode;
                        } // end if
                        else // do not traverse empty elements
                        {
                            // assign NodeType string to newNode
                            // and add it to tree

                            newNode.Header = reader.NodeType.ToString();
                            TreeViewItem.Items.Add(newNode);
                        } // end else
                        break;
                    default: // all other types, display node type
                        newNode.Header = reader.NodeType.ToString();
                        TreeViewItem.Items.Add(newNode);

                        break;
                } // end switch

                newNode = new TreeViewItem();
            } // end while


        } 



    }
       }

2 个答案:

答案 0 :(得分:0)

请尝试以下代码。我使用了xml linq和一个比你的代码简单得多的递归算法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;
using System.Xml.Linq;

namespace TreeView_Test
{
    class Program
    {
        static AutoResetEvent autoEvent = new AutoResetEvent(false);
        [STAThread]
        static void Main(string[] args)
        {
            MainWindow window = new MainWindow();
            window.ShowDialog();
            autoEvent.WaitOne();

        }
    }
    public partial class MainWindow : Window
    {
        private TreeViewItem tree; // TreeViewItem reference
        private TreeView xmlTreeView = new TreeView();
        const string FILENAME1 = @"c:\temp\test1.xml";
        const string FILENAME2 = @"c:\temp\test2.xml";
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded +=new RoutedEventHandler(Window_Loaded);
        }
        private void InitializeComponent()
        {
            this.AddChild(xmlTreeView);
            this.Activate();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {


            tree = new TreeViewItem(); // instantiate TreeViewItem

            tree.Header = "Projekt"; // assign name to TreeViewItem  

            xmlTreeView.Items.Add(tree); // add TreeViewItem to TreeView  

            XDocument doc = XDocument.Load(FILENAME1);
            XElement element = (XElement)doc.FirstNode;
            BuildTree(element, tree); // build node and tree hierarchy

            doc = XDocument.Load(FILENAME2);
            element = (XElement)doc.FirstNode;
            BuildTree(element, tree); // build node and tree hierarchy
        }
        private void BuildTree(XElement element, TreeViewItem treeViewItem)
        {
            // TreeViewItem to add to existing tree
            TreeViewItem newNode = new TreeViewItem();
            treeViewItem.Items.Add(newNode);
            newNode.Header = element.Name.LocalName;
            if (!element.HasElements)
            {
                TreeViewItem newText = new TreeViewItem();
                newNode.Items.Add(newText);
                newText.Header = element.Value;
            }
            else
            {
                foreach (XElement child in element.Elements())
                {
                    BuildTree(child, newNode);
                }
            }
        }
    }
}

答案 1 :(得分:0)

其实我不使用treeview类。但我可以建议如何阅读ml文件。

class Object
{
    public string Type { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Language { get; set; }


    List<Object> Objects { get; set; }
}


class ObjectFinder
{
    private XElement xmlContent;

    public ObjectFinder(string filePath)
    {
        xmlContent = XElement.Load(filePath);
    }
    public List<Object> Objects()
    {
        List<Object> list = new List<Object>();
        return xmlContent.Elements().Select(obj =>
        {
            return new Object
            {
                Description = obj.Attribute("Description").Value,
                Language = obj.Attribute("Language").Value,
                Name = obj.Value,
                Type = obj.Attribute("Type").Value
            };
        }).ToList();
    }
}

类的用法;

ObjectFinder objectFinder = new ObjectFinder("filePath");
List<Object> list = objectFinder.Objects(); 

阅读最顶层文件后,您可以阅读其他文件并将其附加到相关的对象中。如果您无法成功,请告诉我们