c#如何实现从xml中加载树目录,并且显示完整的Text

谈到xml,相信有一定编程基础的童鞋们都比较清楚了。xml文件格式类似于嵌套的样式,这种独特的层次结构很容易使我们联想到目录树,因此这不禁让我们对两者之间产生一种牵线的想法。这不禁,使我们有这么一个问题:如何将xml存储的数据转换成目录树形式??

首先我先贴一段xml代码:

 <nativeplace>
    <China text="中国" value="中国">
      <ShanDong text="山东" value="山东">
        <JiNing text="济宁" value="济宁">
          <RenChengQu text="任城区" value="任城区">
            <ChangGouZhen text="长沟镇" value="长沟镇">
            </ChangGouZhen>
          </ReChengQu>
        </JiNing>
    </ShanDong>
    </China></nativeplace>

这段代码很清楚的展示给我们他们之间的层次关系,接下来,我们就将此xml中的区域与c#的TreeView进行联系,从而达到我们想要的目录树效果。

首先我们需要将xml加载到TreeView中。加载xml也就是我们所说的找到xml然后读取xml内容。在这里我多介绍一段关于寻找程序集路径的代码,我做项目习惯于将xml文件放在程序集bin/Debug下,原因也是c#提供了此访问方式。

接下来的一段代码便是读取项目的程序集Debug路径的方法:

public String GetAssemblyFileDirectory()
		{
			#region 变量说明
			String FilePath, StringX;
			FileInfo FileInfoX;//这里我创建的操作文件夹的类,当然你你也可以用其它方式
			Uri UriX;
			#endregion

			#region 获取.dll的位置

			//获取.dll文件的位置,主要是用于确定数据库文件
			StringX = Assembly.GetCallingAssembly().CodeBase;
			//生成一个URI,以用于解析
			UriX = new Uri(StringX);

			//获取配置文件的目录
			FileInfoX = new FileInfo(UriX.LocalPath);
			FilePath = FileInfoX.DirectoryName;

			//if (!(FilePath.Substring(FilePath.Length - 1, 1) == @"\"))
			//{ FilePath = String.Concat(FilePath, @"\"); }

			return FilePath;
			#endregion
		}

这样我们就获取了xml文件的位置,接下来我们所做的就是加载xml文件。具体代码如下:

 helper = new Helper();//此类中包含了获取程序集目录的方法
            xmlpath = helper.GetAssemblyFileDirectory() + "/Resources/Dictionary.xml";
            XmlDocument xmldoc = new XmlDocument(); //创建xml文档类
            xmldoc.Load(xmlpath);//加载xml文档
            xmlNode = xmldoc.DocumentElement.SelectSingleNode("nativeplace");//获取结点nativeplace
            nodes = xmlNode.ChildNodes;//获取nativeplace结点下的所有孩子结点,此孩子是真孩子结点,并非所有的“后代”结点
            bindXmlToTreeView(nodes, nativePlaceTreeView.Nodes);//该方法是将xml结点加载到TreeView目录树中

接下来我们所做的便是如何遍历nativeplace下所有子结点以及孙子结点等。方法如下:

public void bindXmlToTreeView(XmlNodeList nodeList, TreeNodeCollection treeNode)
        {

            foreach (XmlNode node in nodeList)
            {
                XmlElement xe = (XmlElement)node; //创建一个xml元素,将获取的每一个结点转换成xml元素,方便对其进行属性赋值。
                TreeNode newTreeNode = new TreeNode();//创建一个新的treenode,将xmlnode中信息存到treenode中。
                newTreeNode.Text = xe.GetAttribute("text");
                newTreeNode.Name = xe.GetAttribute("value");
                treeNode.Add(newTreeNode);//将创建并包含信息的treenode加载到treenode集合中。

                if (node.HasChildNodes)
                {
                    bindXmlToTreeView(node.ChildNodes, newTreeNode.Nodes);//孙子结点加载
                }
            }
        }

这样我们就创建好了一个目录树,接下来我展示一下我之前创建好的一个目录树的效果图:

有时我们需要获取treenode的text,然而,当我们点击一个结点时如何获取完整的结点名呢(就是加上其所有父节点的text)?,其实我们可以这样来实现:

 private void okButton_Click(object sender, EventArgs e)
        {

            parentNode(nativePlaceTreeView.SelectedNode);//这里是将获取的点击结点传递过去

            this.Close();
        }
 private void parentNode(TreeNode text)
        {
            TreeNode fullText = text;
            while (text.Parent != null)
            {
                fullText.Text = text.Parent.Text +fullText.Text;//这样总是获取结点的父节点text。
                text = text.Parent;//我们text结点是传递过来的点击结点,然后不断将其父节点赋值给它,这样就可以向上推上去了。知道treeview中的根节点。
            }
            nativeplace["address"] = fullText.Text;//这里只是将结点的文本复制给传递过来的datarow相应的列,大家可以不用管,现在你可以用监视去查看一下fullText.Text就会显示完整的目录名了。
        }

点击确定按钮,则在datagridview中显示详细的名字:

至此xml加载到treeview的方法介绍完毕!

再次祝大家元宵节快乐!!

时间: 2024-12-23 05:47:11

c#如何实现从xml中加载树目录,并且显示完整的Text的相关文章

spring的配置文件在web.xml中加载的方式

web.xml加载spring配置文件的方式主要依据该配置文件的名称和存放的位置不同来区别,目前主要有两种方式. 1.如果spring配置文件的名称为applicationContext.xml,并且存放在WEB-INF/目录下,那么只需要在web.xml中加入以下代码即可 <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> &

spring controller中@Value取不到applicationContext.xml中加载配置文件的问题

原因还未查证: http://sunjun041640.blog.163.com/blog/static/256268322014127113844746/ 在使用spring mvc时,实际上是两个spring容器: 1,dispatcher-servlet.xml 是一个,我们的controller就在这里,所以这个里面也需要注入属性文件 org.springframework.web.servlet.DispatcherServlet 这里最终是使用WebApplicationContex

在WebView中加载HTML页面时显示进度对话框的方法

webView.setWebViewClient(new WebViewClient(){            ProgressDialog prDialog;            @Override            public void onPageStarted(WebView view, String url, Bitmap favicon) {                prDialog = ProgressDialog.show(BrowseNewsActivity.t

IDEA中加载 resource目录下文件

1. 通过classloder加载资源文件 ClientEntrance.class.getClassLoader().getResourceAsStream("config/log4j.properties"): 原文地址:https://www.cnblogs.com/virgosnail/p/10119674.html

左侧动态加载树,右侧显示树节点的信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %><!DOCTYPE html><!--[if IE 8]> <html lang="en" class="ie8 no-js"> <![endif]--><!--[if IE 9]> <html lang="en

如何在OsgEarth中加载谷歌卫星地图的ArcGISServer服务教程

说明: 本实例演示如何在arcgis中发布下载好的影像瓦片数据,在osgearth中加载发布好的瓦片服务. 本实例使用软件版本:ArcGIS10.2,osg3.3.1和osgEarth2.5 VC10编译环境(参考osgearth加载谷歌卫星地图的源码案例),水经注万能地图下载器. 影像瓦片来源"水经注万能地图下载器".如果没有安装本软件,可以百度"水经注软件"到官方网站下载. 一.下载瓦片数据 启动水经注万能地图下载器,点击"框选下载区域",双

MyBatis Java不同方式加载文件时的路径格式问题、Mybatis中加载.properties文件

public class LoadPropTest { public static void main(String[] args) throws IOException { //一.Properties的load方法加载文件输入流 Properties props=new Properties(); File file1=new File("F:/Program Files/Java/IdeaProjects/MyBatisDemo/src/db.properties"); File

ExtJS 动态加载树treepanel

先来看看效果: 一.新建一个TreeStore,并添加根节点 Ext.define('Demo1.store.TreeDemoStore', { extend: 'Ext.data.TreeStore', root: { text: '目录树', id: 0 } }); 二.在view中添加treepanel,绑定TreeDemoStore Ext.define('Demo1.view.MyViewport', { extend: 'Ext.container.Viewport', initCo

Spring中加载xml配置文件的六种方式

因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装入系统,这就需要利用Spring去动态加载某一位置下的配置文件,所以就总结了下Spring中加载xml配置文件的方式,我总结的有6种, xml是最常见的spring 应用系统配置源.Spring中的几种容器都支持使用xml装配bean,包括: XmlBeanFactory,ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicati