2012-10-08 72 views
0

我是新來的C#我有問題...... 我想從我的XMl文件 在這裏,我只是使用此代碼試圖刪除selected node但我沒有請可以在如何從C#中的XML中刪除選定的節點?

private void btnDelete_Click(object sender, EventArgs e) 
{ 
    xdoc.Load(strFilename); 
    string Xpath = string.Format("root/{0}/{1}",_strProCat,_strProdType); 
    xdoc.SelectSingleNode(Xpath).RemoveAll(); 

    xdoc.Save(strFilename); 
    MessageBox.Show("Deleted Successfully"); 
} 
任何一項幫助

這裏我的XML文件

<root> 
    <product category="Soaps"> 
    <product type="Washing"> 
    <product name="Rin"> 
     <Id>100</Id> 
     <AvailProducts>30</AvailProducts> 
     <Cost>20.00</Cost> 
    </product> 
    <product name="Tide"> 
    <Id>101</Id> 
    <AvailProducts>30</AvailProducts> 
    <Cost>15.00</Cost> 
    </product> 
</product> 
</product> 
</root> 

只是我想刪除節點,其產品name="Tide"

+0

是什麼'xdoc'? – Usman

+1

哪種類型是'xdoc'以及'_strProCat'和'_strProdType'的值是什麼? –

+0

你能告訴我,你如何在XML文件中添加** ID **?帶自動+1的新紀錄 –

回答

1

你可以簡單的使用下面的代碼:

private void btnDelete_Click(object sender, EventArgs e) 
{ 
    var xDoc = XDocument.Load(strFilename); 

    foreach (var elem in xDoc.Document.Descendants("product")) 
    { 
     foreach (var attr in elem.Attributes("name")) 
     { 
      if (attr.Value.Equals("Tide")) 
       elem.RemoveAll(); 
     } 
    } 

    xDoc.Save(destinationFilename); 
    MessageBox.Show("Deleted Successfully"); 
} 

編碼快樂......

+0

感謝提供解決方案......... – rangasathish

1

像這樣的東西應該這樣做:

xdoc.Elements("product").Where(x=> x.Element("name").Value == "Tide").FirstOrDefault().Remove(); 
1

如果你想用XPath然後XmlDocument下面是做到這一點的方式..

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(strFilename); 
string Xpath = string.Format("root/product[@category='{0}']/product[@type='{1}']/product[@name='{2}']", "Soaps", "Washing", "Tide"); 
xdoc.SelectSingleNode(Xpath).RemoveAll(); 
xdoc.Save(strFilename); 

更新

按您的要求To Remove the empty node,試試下面的代碼刪除空節點

XmlNodeList emptyElements = xdoc.SelectNodes(@"//*[not(node())]"); 
for (int i = emptyElements.Count - 1; i > -1; i--) 
{ 
    XmlNode nodeToBeRemoved = emptyElements[i]; 
    nodeToBeRemoved.ParentNode.RemoveChild(nodeToBeRemoved); 
} 

現在,您的最終全肉的代碼看起來像爲

string Xpath = string.Format("root/product[@category='{0}']/product[@type='{1}']/product[@name='{2}']", "Soaps", "Washing", "Tide");      
xdoc.SelectSingleNode(Xpath).RemoveAll(); 
XmlNodeList emptyElements = xdoc.SelectNodes(@"//*[not(node())]"); 

for (int i = emptyElements.Count - 1; i > -1; i--) 
{ 
     XmlNode nodeToBeRemoved = emptyElements[i]; 
     nodeToBeRemoved.ParentNode.RemoveChild(nodeToBeRemoved); 
} 
xdoc.Save(strFilename); 
+0

它會正常工作,但在這段代碼中我已經困擾一個問題 – rangasathish

+0

<產品名稱=「凜」> < AvailProducts> 30 20.00 刪除此屬性後都保持我要的是刪除這些節點S還請我應該怎麼辦? – rangasathish

+0

我更新了我的代碼,我希望它對您有所幫助。 – Usman