2009-05-28 11 views
15

Duplicar posible:
How to remove an XmlNode from XmlNodeList¿Cómo suprimir nodo desde el archivo XML usando C#

Hola, ¿Cómo puedo eliminar un conjunto de nodos de un archivo XML.? Aquí hay un fragmento de código.

string path = @"C:\Documents and Settings\e454935\Desktop\NUnitSettings.xml"; 
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument(); 
xmldoc.Load(fs); 
fs.Close(); 
xmldoc.DocumentElement.RemoveChild(xmldoc.DocumentElement.ChildNodes[1]); 
FileStream WRITER = new FileStream(path, FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite); 
xmldoc.Save(WRITER); 
WRITER.Close(); 

He probado el siguiente código simplemente para eliminar un nodo y tiene "Referencia a objeto no establecida como instancia de un objeto." en

xmldoc.DocumentElement.RemoveChild(xmldoc.DocumentElement.ChildNodes[1]); 

Aquí está un ejemplo de archivo XML,

<?xml version="1.0"?> 
<Xml1> 
    <Settings> 
    <Setting name="DisplayFormat" value="Full" /> 
    <Setting name="File1" value="a" /> 
    <Setting name="File1" value="b" /> 
    <Setting name="File1" value="c" /> 
    <Setting name="File1" value="d" /> 
    </Settings> 
</Xml1> 

realidad de este archivo que desea eliminar los cuatro nodos ARCHIVO1 que tiene los valores "a, b, c, d" y entonces quiero añadir un nodo,

<Setting name="File1" value="e" /> 

¿Cómo puedo hacer esto.?

+3

Esto ha sido respondido aquí http://stackoverflow.com/questions/875136 ya, y probablemente dos docenas de veces en otras preguntas. Votado para cerrar como un engañado. – Tomalak

Respuesta

6

Puede ser más fácil usar XPath para localizar los nodos que desea eliminar. This stackoverflow thread podría darle algunas ideas.

En su caso se encuentran los cuatro nodos que desea utilizar esta expresión:

XmlDocument doc = new XmlDocument(); 
doc.Load(fileName); 
XmlNodeList nodes = doc.SelectNodes("//Setting[@name='File1']"); 
2

DocumentElement es el nodo raíz del documento por lo que childNodes[1] no existe en ese documento. childNodes[0] sería el < Configuración > nodo

+0

+1 para explicar dónde se encuentra el error. – Tomalak

23

Usted puede utilizar Linq to XML para hacer esto:

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

Eliminación de nodos de XML

  XmlDocument doc = new XmlDocument(); 
      doc.Load(path); 
      XmlNodeList nodes = doc.SelectNodes("//Setting[@name='File1']"); 
      for (int i = nodes.Count - 1; i >= 0; i--) 
      { 
       nodes[i].ParentNode.RemoveChild(nodes[i]); 
      } 
      doc.Save(path); 

Agregar atributo a Nodos en XML

XmlDocument originalXml = new XmlDocument(); 
    originalXml.Load(path); 
    XmlNode menu = originalXml.SelectSingleNode("//Settings"); 
    XmlNode newSub = originalXml.CreateNode(XmlNodeType.Element, "Setting", null); 
    XmlAttribute xa = originalXml.CreateAttribute("name"); 
    xa.Value = "qwerty"; 
    XmlAttribute xb = originalXml.CreateAttribute("value"); 
    xb.Value = "555"; 
    newSub.Attributes.Append(xa); 
    newSub.Attributes.Append(xb); 
    menu.AppendChild(newSub); 
    originalXml.Save(path); 
+0

No estoy seguro de por qué fue votado negativamente, pero +1 de mí. Ese node.ParentNode.RemoveChild (node) es una útil línea de código para recordar. –

Cuestiones relacionadas