关于XML删除某节点跳出遍历的问题。

suoluo110 2009-08-22 05:00:41
xml代码

<?xml version="1.0" encoding="shift_jis"?>
<config>
<message id="5">
<userGroup>CK</userGroup>
</message>
<message id="21">
<userGroup>CCC-WEB</userGroup>
<userName>XXMA</userName>
<userIP>192.168.100.47</userIP>
<userType>TCP</userType>
<userPath>C:\imart</userPath>
<userStatues>1</userStatues>
</message>
<message id="22">
<userGroup>CCC-WEB</userGroup>
<userName>WFDU</userName>
<userIP>192.168.100.79</userIP>
<userType>TCP</userType>
<userPath>C:\imart</userPath>
<userStatues>1</userStatues>
</message>
<message id="23">
<userGroup>CCC-WEB</userGroup>
<userName>SUNHL</userName>
<userIP>192.168.100.100</userIP>
<userType>TCP</userType>
<userPath>C:\imart</userPath>
<userStatues>1</userStatues>
</message>
<message id="24">
<userGroup>CCC-WEB</userGroup>
<userName>ZYGUO</userName>
<userIP>192.168.100.105</userIP>
<userType>TCP</userType>
<userPath>C:\imart</userPath>
<userStatues>1</userStatues>
</message>
</config>

C#代码
public static void deleteFormXML(String[] deleteNameAL)
{
XmlDocument doc = new XmlDocument();

doc.Load("D:\\Config.xml");

XmlNode root = doc.SelectSingleNode("config");

XmlNodeList nodeList = root.ChildNodes;

foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;

XmlNodeList nls = xe.ChildNodes;

foreach (XmlNode xn1 in nls)
{
XmlElement xe1 = (XmlElement)xn1;

if (xe1.Name == "userName")
{
for (int i = 0; i < deleteNameAL.Length; i++)
{
if (deleteNameAL[i] != "" && xe1.InnerText == deleteNameAL[i])
{
root.RemoveChild(xe1.ParentNode);
}
}
}
}
}

doc.Save("D:\\Config.xml");
}

代码作用,删除指定的deleteNameAL中的多个用户的<message></message>节点。
当userName指定为XXMA与WFDU的时候。同时删除这两条数据。
使其变成如下格式
<?xml version="1.0" encoding="shift_jis"?>
<config>
<message id="5">
<userGroup>CK</userGroup>
</message>
<message id="23">
<userGroup>CCC-WEB</userGroup>
<userName>SUNHL</userName>
<userIP>192.168.100.100</userIP>
<userType>TCP</userType>
<userPath>C:\imart</userPath>
<userStatues>1</userStatues>
</message>
<message id="24">
<userGroup>CCC-WEB</userGroup>
<userName>ZYGUO</userName>
<userIP>192.168.100.105</userIP>
<userType>TCP</userType>
<userPath>C:\imart</userPath>
<userStatues>1</userStatues>
</message>
</config>

但是在删除的过程中。发现只能删除一条数据。当执行root.RemoveChild(xe1.ParentNode);后,发现代码会跳出对整个<config>节点的遍历。如果将该语句注释后。遍历可以正常进行。

请问有什么办法。可以对多条数据进行删除。或是可以不跳出遍历~

谢谢



...全文
157 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
suoluo110 2009-08-24
  • 打赏
  • 举报
回复
OK。谢一楼。结贴。送分
suoluo110 2009-08-24
  • 打赏
  • 举报
回复
谢谢一楼。今天刚上班。我试验一下
lovezhxf 2009-08-23
  • 打赏
  • 举报
回复
学习XML,
zgke 2009-08-22
  • 打赏
  • 举报
回复
string[] deleteNameAL = new string[] { "XXMA ", "WFDU " };

XmlDocument doc = new XmlDocument();

doc.Load("C:\\1.XML");

for (int i = 0; i != deleteNameAL.Length; i++)
{
XmlNodeList _List = doc.SelectNodes("config/message/userName[.='" + deleteNameAL[i] + "']/parent::node()");
foreach (XmlNode _SubNode in _List)
{
_SubNode.ParentNode.RemoveChild(_SubNode);
}

}


doc.Save("C:\\2.XML");

这样?

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧