博客园提问,结合网友回答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 { } }