积极答复者
关于XML相同节点的删除的问题!求教···

问题
-
如果一个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的提取出来然后再循环删除?
请教下有什么好的思路,解决方案,代码,都可以。谢谢!- 已移动 Sheng Jiang 蒋晟Moderator 2009年11月10日 4:50 XML问题 (发件人:.NET Framework 一般性问题讨论区)
答案
-
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
全部回复
-
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