• 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
    
                {
    
                }
    
            }
    
    
    
  • 相关阅读:
    《Java数据结构与算法》笔记-CH4-5不带计数字段的循环队列
    《Java数据结构与算法》笔记-CH4-4循环队列
    效率方案:快速切换联调、测试、正式环境
    redis 安装、配置与测试
    计算机科学中的圣经
    自建主机
    正则表达式学习入门
    数据库查询语句缺失部分索引,引起的问题(20170209)
    redis 经验、问题以及其解决方案
    资讯周刊---20170210
  • 原文地址:https://www.cnblogs.com/jhlong/p/5445404.html
Copyright © 2020-2023  润新知