2009-05-28 8 views
15

Possible en double:
How to remove an XmlNode from XmlNodeListComment supprimer le noeud à partir du fichier XML en utilisant C#

Salut, Comment puis-je supprimer un ensemble de noeuds à partir d'un fichier XML.? Voici un extrait de code.

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(); 

J'ai essayé le code suivant simplement de supprimer un noeud et obtenu « référence d'objet non définie à une instance d'un objet. » à

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

Voici un fichier XML exemple,

<?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> 

En fait, à partir de ce fichier que je veux supprimer les Quatre noeuds Fichier1 qui a les valeurs "a, b, c, d" et alors je veux ajouter un nœud,

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

Comment puis-je faire cela.?

+3

Cela a déjà été trouvé ici http://stackoverflow.com/questions/875136 déjà, et probablement deux douzaines de fois dans d'autres questions. Voté pour fermer en dupe. – Tomalak

Répondre

6

Il peut être plus facile d'utiliser XPath pour localiser les nœuds que vous souhaitez supprimer. This stackoverflow thread pourrait vous donner quelques idées.

Dans votre cas, vous trouverez les quatre nœuds que vous voulez en utilisant cette expression:

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

DocumentElement est le noeud racine du document, de sorte que childNodes[1] n'existe pas dans ce document. childNodes[0] serait le < Paramètres > nœud

+0

+1 pour expliquer où se situe l'erreur. – Tomalak

23

Vous pouvez utiliser Linq to XML pour ce faire:

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

Suppression de noeuds 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); 

Ajout d'attribut aux noeuds 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

Je ne sais pas pourquoi vous avez été déprimé, mais +1 de moi. Ce node.ParentNode.RemoveChild (node) est une ligne de code pratique à retenir. –

Questions connexes