2012-10-08 46 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