视频图像处理系列索引 || Arcgis/Engine/Server开发索引 || Web Map Gis开发索引 || jquery表格组件 JQGrid索引
WPF MVVM模式开发实现简明教程索引 || ArcGIS Runtime WPF(.net C#)开发简明教程索引

C#操作XML,如何获取指定节点值?

博客园提问,结合网友回答http://q.cnblogs.com/q/36082/
 
打开是treelist树形显示xml所有节点,递归来实现
xmlDoc = new XmlDocument();
                xmlDoc.Load(filename);
                XmlNode node = xmlDoc.DocumentElement;
                
                TreeListNode rootNode = treeListNode.AppendNode(new object[] { node.Name }, -1, node);
                GenerateNodeTree(rootNode, node);
private void GenerateNodeTree(TreeListNode rootNode, XmlNode node)
        {
            for (int i = 0; i < node.ChildNodes.Count; i++)
            {
                XmlNode xnl = node.ChildNodes[i];
                TreeListNode childNode = treeListNode.AppendNode(new object[] { xnl.Name }, -1, xnl);
                treeListNode.MoveNode(childNode, rootNode);
                GenerateNodeTree(childNode, xnl);
            }
        }

 


我用的treelist控件控件进行各个节点的显示,treelist的第一列存xmlnode.name,第二列是
xmlnode.value,tag是node。所以修改后,可以遍历这些节点值或者注释的父节点下的所有子节点,= tag的就是这个修改的节点,设置其value后保存即可
其中
xmlDoc是一个全局变量,打开时给他赋值,以后不重复打开了。如果重复打开同一文件判断
(xnl == node)时很可能不相等
 
/// <summary>

        /// 修改 <a>text</a> 里的text,防止内部有注释或者更多注记。此函数仍不好用,复杂的就无法处理了,需改进

        /// </summary>

        /// <param name="xmlpath">The xmlpath.</param>

        /// <param name="node">The node.</param>

        /// <param name="value">The value.</param>

        private void UpdateInnerXml(string xmlpath, string nodename, string value, XmlNode node)

        {

            try

            {

                XmlNode xn = xmlDoc.SelectSingleNode(nodename);

 

                XmlNode xnl = null;

                bool exist = false;

                ////理论上这里可以找到一个子节点Name == "#text"且=treelist node的tag,如果没找到再考虑截位

                for (int i = 0; i < xn.ChildNodes.Count; i++)

                {

                    xnl = xn.ChildNodes[i];

                    if (xnl == node)

                    {

                        exist = true;

                        break;

                    }

                }

 

                if ((xnl != null) && exist)

                {

                    xnl.Value = value; 

                    node.Value = value; 

                }

                else

                {

                    XmlElement xe = (XmlElement)xn;

                    ////截取xe.InnerXml中xe.InnerText部分替换为修改内容,有与xe.InnerText相同的其他地方就无法处理了

                    xe.InnerXml = xe.InnerXml.Substring(0, xe.InnerXml.IndexOf(xe.InnerText)) + value + xe.InnerXml.Substring(xe.InnerXml.IndexOf(xe.InnerText) + xe.InnerText.Length);

                }

                xmlDoc.Save(xmlpath);

            }

            catch

            {

            }

        }

 

posted @ 2016-04-29 10:32  jhlong  阅读(3503)  评论(0编辑  收藏  举报
海龙的博客 jhlong@cnblogs 版权所有© 转载请注明链接.有用请推荐一下
代码全部经过本人测试,但不保证复制粘贴就正常运行,更不保证能解决你的问题,请结合前后代码及描述理解后修改和使用