none
关于XML相同节点的删除的问题!求教··· RRS feed

  • 问题

  • 如果一个xml的格式是
    <list>
     <Model>
      <name></name>
      <id></id>
     </Model>

     <Model>
      <name></name>
      <id></id>
     </Model>

     <Model>
      <name></name>
      <id></id>
     </Model>
    </list>


    id有可能是相同的,现在我要删除ID为1的所有的<Model>节点

     XmlNodeList xnl=xml_Root.ChildNodes;
     //删除所有的符合类型的节点
    foreach (XmlNode xnf in xnl)
      {
           XmlNodeList xnf1 = xnf.ChildNodes;
           if (xnf1[2].InnerXml.Equals("1"))
           {
               xml_Root.RemoveChild(xnf);
           }

     }

    这是我的删除代码,前提条件,该xml文件中已经有数个ID为1的<Model>子节点,获取XML文件一切正常,

    但是代码错误,调试了一次后发现xml_Root.RemoveChild(xnf);执行第一次后就跳出了当前循环,

    我想要问的就是,难道这里我只能用递归或者是先将ID为1的提取出来然后再循环删除?

    请教下有什么好的思路,解决方案,代码,都可以。谢谢!

    2009年11月9日 3:10

答案

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 原因是你在 foreach 中删除了记录影响了 foreach 循环
                // 解决方法如下。
                string xml = @"
                <list>
    	            <Model>
    		            <name></name>
    		            <id>1</id>
    	            </Model>
    	            <Model>
    		            <name></name>
    		            <id>1</id>
    	            </Model>
    	            <Model>
    		            <name></name>
    		            <id>2</id>
    	            </Model>
                </list>";
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
    
                XmlNode xml_Root = doc.DocumentElement;
                XmlNodeList xnl = xml_Root.ChildNodes;
                //删除所有的符合类型的节点
                List<XmlNode> deleteNodes = new List<XmlNode>();
    
                foreach (XmlNode xnf in xnl)
                {
                    XmlNodeList xnf1 = xnf.ChildNodes;
                    if (xnf1[1].InnerXml.Equals("1"))
                    {
                        //xml_Root.RemoveChild(xnf);
                        deleteNodes.Add(xnf);
                    }
                }
    
                foreach (XmlNode node in deleteNodes)
                {
                    xml_Root.RemoveChild(node);
                }
    
                Console.WriteLine(doc.OuterXml);
                Console.ReadKey();
            }
        }
    }
    

    知识改变命运,奋斗成就人生!
    • 已标记为答案 天驰 2009年11月9日 4:35
    2009年11月9日 3:45
    版主

全部回复

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 原因是你在 foreach 中删除了记录影响了 foreach 循环
                // 解决方法如下。
                string xml = @"
                <list>
    	            <Model>
    		            <name></name>
    		            <id>1</id>
    	            </Model>
    	            <Model>
    		            <name></name>
    		            <id>1</id>
    	            </Model>
    	            <Model>
    		            <name></name>
    		            <id>2</id>
    	            </Model>
                </list>";
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
    
                XmlNode xml_Root = doc.DocumentElement;
                XmlNodeList xnl = xml_Root.ChildNodes;
                //删除所有的符合类型的节点
                List<XmlNode> deleteNodes = new List<XmlNode>();
    
                foreach (XmlNode xnf in xnl)
                {
                    XmlNodeList xnf1 = xnf.ChildNodes;
                    if (xnf1[1].InnerXml.Equals("1"))
                    {
                        //xml_Root.RemoveChild(xnf);
                        deleteNodes.Add(xnf);
                    }
                }
    
                foreach (XmlNode node in deleteNodes)
                {
                    xml_Root.RemoveChild(node);
                }
    
                Console.WriteLine(doc.OuterXml);
                Console.ReadKey();
            }
        }
    }
    

    知识改变命运,奋斗成就人生!
    • 已标记为答案 天驰 2009年11月9日 4:35
    2009年11月9日 3:45
    版主
  • for (int i = 0; i < xnl.Count; i++)
                {
                    foreach (XmlNode xnf in xnl)
                    {
                        XmlNodeList xnf1 = xnf.ChildNodes;
                        if (ImageTypeName.Equals(xnf1[2].InnerXml))
                        {
                            //使用下面的代码的话,该循环不会全部执行完毕
                            xml_Root.RemoveChild(xnf);
                        }
                    }
                }

    我自己换的循环,

    谢谢了·
    2009年11月9日 4:33