web-dev-qa-db-fra.com

Comment supprimer un nœud d'un fichier XML à l'aide de C #

Duplicata possible:
Comment supprimer un XmlNode de XmlNodeList

Salut, Comment puis-je supprimer un ensemble de nœuds 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 pour supprimer un nœud et j'ai obtenu "Référence d'objet non définie sur une instance d'un objet." à

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

Voici un exemple de fichier 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>

En fait, dans ce fichier, je veux supprimer les quatre nœuds File1 qui ont les valeurs "a, b, c, d" et ensuite je veux ajouter un nœud ,

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

Comment puis-je faire ceci.?

19
SyncMaster

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

Dans votre cas, vous trouverez les quatre nœuds que vous souhaitez utiliser avec cette expression:

XmlDocument doc = new XmlDocument();
doc.Load(fileName);
XmlNodeList nodes = doc.SelectNodes("//Setting[@name='File1']");
6
Fredrik Mörk

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");
25
idursun

Suppression de nœuds 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 nœuds 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);
8
SyncMaster

DocumentElement est le nœud racine du document donc childNodes[1] n'existe pas dans ce document. childNodes[0] serait le nœud <Settings>

3
PQW