web-dev-qa-db-fra.com

Comment supprimer la première ligne d'un fichier XML à l'aide de XMLDocument en C #?

Je lis un fichier XML en C # en utilisant XMLDocument. Mon code va comme ceci:

XmlDocument doc = new XmlDocument();
doc.Load(xmlSourceFile);

La première ligne de mon document XML est

<?xml version="1.0" encoding="UTF-8"?>

Je dois supprimer cette ligne. Comment devrais-je?

16
user1556433

Je ne vois pas pourquoi vous voudriez enlever ça. Mais si cela est nécessaire, vous pouvez essayer ceci:

XmlDocument doc = new XmlDocument();
doc.Load("something");

foreach (XmlNode node in doc)
{
    if (node.NodeType == XmlNodeType.XmlDeclaration)
    {
        doc.RemoveChild(node);
    }
}

ou avec LINQ:

var declarations = doc.ChildNodes.OfType<XmlNode>()
    .Where(x => x.NodeType == XmlNodeType.XmlDeclaration)
    .ToList();

declarations.ForEach(x => doc.RemoveChild(x));
22
Matt

J'avais besoin d'une chaîne sérialisée XML sans l'en-tête de déclaration pour que le code suivant fonctionne pour moi.

StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings {
    Indent = true,
    OmitXmlDeclaration = true, // this makes the trick :)
    IndentChars = "  ",
    NewLineChars = "\n",
    NewLineHandling = NewLineHandling.Replace
};
using (XmlWriter writer = XmlWriter.Create(sb, settings)) {
    doc.Save(writer);
}
return sb.ToString();
7
Elazar Neeman

Sinon, vous pouvez utiliser ceci;

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
if (xmlDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
    xmlDoc.RemoveChild(xmlDoc.FirstChild);
5
Engin Ardıç

Je comprends la nécessité d’éliminer la déclaration XML; Je travaille sur un script qui modifie le contenu du preferences.xml d'une application, et l'application ne lit pas le fichier correctement si la déclaration est présente (vous ne savez pas pourquoi les développeurs ont décidé de ne pas utiliser la déclaration XML).

Au lieu de jouer plus longtemps avec le XML, je viens de créer une méthode removeXMLdeclaration() qui lit le fichier XML et supprime la première ligne, puis le réécrit simplement à l'aide de streamreaders/writerers. Il est rapide comme l'éclair et fonctionne très bien! J'appelle simplement la méthode après avoir effectué toutes mes modifications XML pour nettoyer le fichier une fois pour toutes.

Voici le code:

public void removeXMLdeclaration()
    {
        try
        {
            //Grab file
            StreamReader sr = new StreamReader(xmlPath);

            //Read first line and do nothing (i.e. eliminate XML declaration)
            sr.ReadLine();
            string body = null;
            string line = sr.ReadLine();
            while(line != null) // read file into body string
            {
                body += line + "\n";
                line = sr.ReadLine();
            }
            sr.Close(); //close file

            //Write all of the "body" to the same text file
            System.IO.File.WriteAllText(xmlPath, body);
        }
        catch (Exception e3)
        {
            MessageBox.Show(e3.Message);
        }

    }
1
Ben Holland

Une solution très simple et rapide consiste à utiliser la propriété DocumentElement de la classe XmlDocument:

XmlDocument doc = new XmlDocument();
doc.Load(xmlSourceFile);
Console.Out.Write(doc.DocumentElement.OuterXml);
0
Vladimir Zelenov

Il existe un autre moyen de fermer ce fichier d’utilisation de fichier.

public void xyz ()
{
       FileStream file = new FileStream(xmlfilepath, FileMode.Open, FileAccess.Read);
       XmlDocument doc = new XmlDocument();
       doc.load(xmlfilepath);

      // do whatever you want to do with xml file

      //then close it by 
      file.close();
      File.Delete(xmlfilepath);
}
0
Manjeet Singh