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

            {

            }

        }
 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM