2016-12-23 2 views
0

Ich habe einen Ordner und enthält mehrere Ordner, jeder Ordner hat eine XML-Dateien mit dem Namen Paket. Ich möchte eine Baumansicht erstellen. so muss schauen das TreeView enter image description hereWie man mehrere XML-Dateien an TreeView binden C# WPF

XML frist Dateistruktur:

<?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>
XML Zweite Dateistruktur:
<?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>

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 


     } 



    } 
     } 

Antwort

0

Try Code unten. Ich benutzte XML Linq und einen rekursiven Algorithmus, der viel einfacher als Ihr Code ist.

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); 
       } 
      } 
     } 
    } 
} 
0

Eigentlich benutze ich nicht treeview class.Aber ich kann vorschlagen, wie ml Datei lesen.

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(); 
    } 
} 

Verwendung von Klassen;

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

Nach der obersten Datei lesen, können Sie andere Dateien lesen und bringen Sie sie in Zusammenhang mit Object.If Sie es nicht machen können, lassen Sie mich wissen

Verwandte Themen