2012-03-26 7 views
0

Ich habe eine XML-Datei mit dem Namen "books.xml" im Link "http://msdn.microsoft.com/en-us/library/ windows/desktop/ms762271 (v = V.85) .aspx ". Was meine Anforderung war, nur die <title> von XML-Informationen als Knoten in der Strukturansicht anzuzeigen. Aber wenn ich die folgende Kodierung seine Anzeige alle Werte als Knoten wie "Katalog" als rootnode, Buch als Elternknoten für alle dann Autor, Titel, Genre usw. als Knoten aber ich will nur Wurzelknotenkatalog und -titel als Knoten nicht sogar Buch . Kann jede Stelle mir leiten, welche Modifikation i für die Anzeige von Titel in der exisitng Logik tun muß, alsWie filtert man Daten aus der XML-Datei zur Anzeige nur als Knoten in der Baumansicht ausgewählt

Knoten
OpenFileDialog dlg = new OpenFileDialog(); 
     dlg.Title = "Open XML document"; 
     dlg.Filter = "XML Files (*.xml)|*.xml"; 
     dlg.FileName = Application.StartupPath + "\\..\\..\\Sample.xml"; 
     if (dlg.ShowDialog() == DialogResult.OK) 
     { 
      try 
      { 
       //Just a good practice -- change the cursor to a 
       //wait cursor while the nodes populate 
       this.Cursor = Cursors.WaitCursor; 
       //First, we'll load the Xml document 
       XmlDocument xDoc = new XmlDocument(); 
       xDoc.Load(dlg.FileName); 
       //Now, clear out the treeview, 
       //and add the first (root) node 
       treeView1.Nodes.Clear(); 
       treeView1.Nodes.Add(new 
        TreeNode(xDoc.DocumentElement.Name)); 
       TreeNode tNode = new TreeNode(); 
       tNode = (TreeNode)treeView1.Nodes[0]; 
       //We make a call to addTreeNode, 
       //where we'll add all of our nodes 
       addTreeNode(xDoc.DocumentElement, tNode); 
       //Expand the treeview to show all nodes 
       treeView1.ExpandAll(); 
      } 
      catch (XmlException xExc) 
      //Exception is thrown is there is an error in the Xml 
      { 
       MessageBox.Show(xExc.Message); 
      } 
      catch (Exception ex) //General exception 
      { 
       MessageBox.Show(ex.Message); 
      } 
      finally 
      { 
       this.Cursor = Cursors.Default; //Change the cursor back 
      } 
     }} 
     //This function is called recursively until all nodes are loaded 
    private void addTreeNode(XmlNode xmlNode, TreeNode treeNode) 
    { 
     XmlNode xNode; 
     TreeNode 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.Nodes.Add(new TreeNode(xNode.Name)); 
       tNode = treeNode.Nodes[x]; 
       addTreeNode(xNode, tNode); 
      } 
     } 
     else //No children, so add the outer xml (trimming off whitespace) 
      treeNode.Text = xmlNode.OuterXml.Trim(); 
    } 
+0

versuchen [linqtoXML] (http://msdn.microsoft.com/en-us/library/bb387098.aspx) – pylover

+0

Wenn jemand schreibt meinen exisitng Codierung, das wird hilfreich sein – michale

Antwort

1

Ich nehme Ihre Absicht nur Titel und nichts anderes unter Kategorie Knoten zu zeigen. In diesem Fall versuchen Sie folgende Version von addTreeNode Methode:

private void addTreeNode(XmlNode xmlNode, TreeNode treeNode) 
    { 
     XmlNode xNode; 
     TreeNode tNode; 
     XmlNodeList xNodeList; 
     if (xmlNode.HasChildNodes && xmlNode.Name != "title") //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.Nodes.Add(new TreeNode(xNode.Name)); 
       //tNode = treeNode.Nodes[x]; 
       addTreeNode(xNode, treeNode); 
      } 
     } 
     else if (xmlNode.Name == "title") //No children, so add the outer xml (trimming off whitespace) 
      treeNode.Nodes.Add(new TreeNode(xmlNode.InnerText)); 
    } 

aber ich muss betonen, dass dies sehr ineffizient und unelegant Weg ist das Ziel zu erreichen. Sie können diesen tatsächlich tun sehr einfach mit XPath-Ausdruck wie folgt:

OpenFileDialog dlg = new OpenFileDialog(); 
    dlg.Title = "Open XML document"; 
    dlg.Filter = "XML Files (*.xml)|*.xml"; 
    dlg.FileName = Application.StartupPath + "\\..\\..\\Sample.xml"; 
    if (dlg.ShowDialog() == DialogResult.OK) 
    { 
     try 
     { 
      //Just a good practice -- change the cursor to a 
      //wait cursor while the nodes populate 
      this.Cursor = Cursors.WaitCursor; 
      //First, we'll load the Xml document 
      XmlDocument xDoc = new XmlDocument(); 
      xDoc.Load(dlg.FileName); 
      //Now, clear out the treeview, 
      //and add the first (root) node 

      treeView1.Nodes.Clear(); 
      TreeNode rootTreeNode = new TreeNode(xDoc.DocumentElement.Name); 
      treeView1.Nodes.Add(rootTreeNode); 

      foreach (XmlNode titleNode in xDoc.DocumentElement.SelectNodes(@"//title")) 
      { 
       rootTreeNode.Nodes.Add(titleNode.InnerText); 
      } 

      treeView1.ExpandAll(); 
     } 
     catch (XmlException xExc) 
     //Exception is thrown is there is an error in the Xml 
     { 
      MessageBox.Show(xExc.Message); 
     } 
     catch (Exception ex) //General exception 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      this.Cursor = Cursors.Default; //Change the cursor back 
     } 
    }} 
+0

Dank seiner Arbeit – michale

Verwandte Themen