2011-12-05 67 views
9

en un archivo XML, tales como:¿Cómo eliminar un elemento xml del archivo?

<Snippets> 
<Snippet name="abc"> 
    <SnippetCode> 
    code goes here 
    </SnippetCode> 
</Snippet> 

<Snippet name="def"> 
    <SnippetCode> 
    code goes here 
    </SnippetCode> 
</Snippet> 
</Snippets> 

¿Cómo puedo eliminar un elemento cuando sólo su nombre de atributo (como abc o def) se le da?

+0

usted no necesita etiqueta de WinForms. Duplicado plausible http://stackoverflow.com/questions/5004481/linq-remove-element-fron-xml-based-on-attribute-value – Reniuz

Respuesta

15

Usted podría intentar algo como esto:

string xmlInput = @"<Snippets> 
<Snippet name=""abc""> 
    <SnippetCode> 
    code goes here 
    </SnippetCode> 
</Snippet> 

<Snippet name=""def""> 
    <SnippetCode> 
    code goes here 
    </SnippetCode> 
</Snippet> 
</Snippets>"; 

// create the XML, load the contents 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlInput); 

// find a node - here the one with name='abc' 
XmlNode node = doc.SelectSingleNode("/Snippets/Snippet[@name='abc']"); 

// if found.... 
if (node != null) 
{ 
    // get its parent node 
    XmlNode parent = node.ParentNode; 

    // remove the child node 
    parent.RemoveChild(node); 

    // verify the new XML structure 
    string newXML = doc.OuterXml; 

    // save to file or whatever.... 
    doc.Save(@"C:\temp\new.xml"); 
} 
+0

Esto es perfecto. Mi código es más o menos el mismo, pero tuve dificultades para obtener el atributo de nombre. Gracias. – david

+2

Odio cuando alguien me pega al golpe :) Casi el código que había escrito. –

+0

@LeslieHanks: me pasa a mí también, todo el tiempo :-) –

1
XDocument doc = XDocument.Load("input.xml"); 
var q = from node in doc.Descendants("Snippet") 
    let attr = node.Attribute("name") 
    where attr != null && attr.Value == "abc" 
    select node; 
q.ToList().ForEach(x => x.Remove()); 
doc.Save("output.xml"); 

.Net 2,0

XmlDocument doc = new XmlDocument(); 
doc.Load("input.xml"); 
XmlNodeList nodes = doc.SelectNodes("//Snippet[@name='abc']"); 

Ahora usted tiene los nodos cuyo nombre = 'abc' atributo, ahora se puede bucle a través de ella y eliminar

+0

No creo que Linq-to-XML esté disponible en .NET 2.0. ... –

+0

debería agregar Tag para .net 2.0 – FosterZ

+0

Inicialmente escribí este código, pero ahora estoy usando NET 2. y tengo problemas para degradarlo. – david

0
XElement xEmp = XElement.Load(@"C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml"); 
      // 
      xEmp.Add(
        new XElement("ToDo", 
         new XElement("Item", item), 
         new XElement("date", date), 
         new XElement("time", time), 
         new XElement("due", due), 
         new XElement("description", description)) 
      ); 
      xEmp.Save(@"C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");` XElement xEmp = XElement.Load(@"C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml"); 
      // 
      xEmp.Add(
        new XElement("ToDo", 
         new XElement("Item", item), 
         new XElement("date", date), 
         new XElement("time", time), 
         new XElement("due", due), 
         new XElement("description", description)) 
      ); 
      xEmp.Save(@"C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");` 
Cuestiones relacionadas