博客園提問,結合網友回答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
{
}
}