如何在C#中使用XMLDocument删除第一行XML文件?

时间:2013-04-16 12:12:07

标签: c# asp.net .net

我正在使用XMLDocument在C#中读取XML文件。我的代码是这样的:

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

我的XML文档的第一行是

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

我必须删除这一行。我该怎么办?

6 个答案:

答案 0 :(得分:24)

我不明白你为什么要删除它。但如果需要,你可以试试这个:

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

答案 1 :(得分:7)

我需要一个没有声明标头的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();

答案 2 :(得分:5)

或者你可以使用它;

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

答案 3 :(得分:1)

我理解消除XML声明的必要性;我正在编写一个改变应用程序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);
        }

    }

答案 4 :(得分:1)

一种非常快速,简便的解决方案是使用XmlDocument类的this links属性:

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

答案 5 :(得分:0)

还有另一种关闭此文件使用文件流的方法。

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