Как удалить первую строку XML файла с помощью XMLDocument в С#?

Я читаю XML файл на С#, используя XMLDocument. Мой код выглядит следующим образом:

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

Первая строка моего документа XML

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

Мне нужно удалить эту строку. Как мне?

Ответ 1

Я не понимаю, почему вы хотите удалить это. Но если это необходимо, вы можете попробовать следующее:

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

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

или с LINQ:

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

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

Ответ 2

В качестве альтернативы вы можете использовать это:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
if (xmlDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
    xmlDoc.RemoveChild(xmlDoc.FirstChild);

Ответ 3

Мне нужно было иметь сериализованную строку XML без заголовка объявления, поэтому для меня работал следующий код.

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

Ответ 4

Я понимаю необходимость устранения XML-декларации; Я работаю над script, который изменяет содержимое приложения preferences.xml, и приложение не читает файл должным образом, если объявление есть (не знаю, почему разработчики решили опустить XML-объявление).

Вместо того, чтобы взаимодействовать с XML больше, я просто создал метод removeXMLdeclaration(), который читает XML файл и удаляет первую строку, а затем перезаписывает его просто с помощью streamreaders/writers. Он молниеносно и отлично работает! Я просто вызываю метод после того, как выполнил все мои изменения XML, чтобы очистить файл раз и навсегда.

Вот код:

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

    }

Ответ 5

Существует другой способ закрыть этот файл, используя поток файлов.

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