2015-03-02 74 views
1

我的XML文件存在问题。从XML文件中删除列入XmlNodeList的节点

<?xml version="1.0" encoding="UTF-8"?> 
    <config> 
    <settings> 
    <excelFilePath>C:\Temp\</excelFilePath> 
    <mailHost>smtp</mailHost> 
    <mailPort>25</mailPort> 
    <mailFrom>[email protected]</mailFrom> 
    <keepInCopy> 
     <mailCC>[email protected]</mailCC> 
     <mailCC>[email protected]</mailCC> 
     <mailCC>[email protected]</mailCC> 
    </keepInCopy> 
    <mailSubject>My Mail subject</mailSubject> 
    <mailBodyPath>Templates\Template1.htm</mailBodyPath> 
    </settings> 
</config> 

在实践中,我只需要删除所有标签“mailCC”。 我目前正在此C#代码,但没有任何反应:

XmlDocument xml = new XmlDocument(); 
xml.Load(FilePath); 

XmlNodeList xnList = xml.GetElementsByTagName("mailCC"); 
foreach (XmlNode xn in xnList) 
{ 
    xn.RemoveChild(xn.FirstChild); 
    xml.Save(FilePath); 
} 

你能帮助我吗?

+2

任何你想使用XmlDocument而不是LINQ to XML的理由?后者使得这个完全无关紧要......(这不会帮助你不告诉我们'xmlTag'是什么,或者......) – 2015-03-02 14:12:43

+0

'xmlTag'的价值是什么? – SwDevMan81 2015-03-02 14:23:28

+0

我刚更新了我的帖子,其中包含必要的信息,xmlTag是字符串“mailCC” – 2015-03-02 14:30:45

回答

1

上删除节点将更新集合,所以你不应该使用foreach循环。

XmlNodeList xnList = xml.GetElementsByTagName("mailCC"); 

while (xnList.Count > 0) { 
    xnList[0].ParentNode.RemoveChild(xnList[0]); 
} 
1

使用XmlDocument将节点从其父节点中删除。但你也可以这样做:

var xn = xml.SelectSingleNode("/config/settings/keepInCopy"); 
if (xn != null) 
{ 
    xn.RemoveAll(); // Remove all "mailCC" elements, but keep "keepInCopy" node **OR** 
    xn.ParentNode.RemoveChild(xn); // Remove "keepInCopy" element and all children 
} 
+0

在foreach中出现错误 - 元素列表已更改。枚举操作无法继续。 – 2015-03-02 14:39:23

+0

请尝试其他版本 – 2015-03-02 14:41:49