Как отфильтровать данные из XML-файла для отображения только выбранных узлов в виде дерева - PullRequest
0 голосов
/ 26 марта 2012

У меня есть XML-файл с именем "books.xml", предоставленный в ссылке "http://msdn.microsoft.com/en-us/library/windows/desktop/ms762271(v=vs.85).aspx". Что я требовал, чтобы отображать только <title> из XML-информации как узлы в древовидном представлении. Но когда я сделал следующее кодирование, его отображение всех значений в виде узлов, таких как «каталог» в качестве корневого узла, книга в качестве родительского узла для всех, кроме автора, заголовка, жанра и т. д. в качестве узлов, но я хочу только каталог корневого узла и заголовок в качестве узлов, даже не книга. мне нужно сделать в существующей логике для отображения заголовка в виде узлов

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

1 Ответ

1 голос
/ 26 марта 2012

Я предполагаю, что вы намерены только показывать заголовки и ничего больше в узлах категории.В этом случае попробуйте следующую версию метода addTreeNode:

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

Однако я должен подчеркнуть, что это очень неэффективный и неэффективный способ достижения цели.Вы можете сделать это очень просто, используя выражение XPath, как показано ниже:

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
        }
    }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...