Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 附加现有XML文件_C#_Xml - Fatal编程技术网

C# 附加现有XML文件

C# 附加现有XML文件,c#,xml,C#,Xml,我有一个现有的XML文件,我想在不改变格式的情况下附加它。现有文件如下所示: <Clients> <User username="farstucker"> <UserID>1</UserID> <DOB /> <FirstName>Steve</FirstName> <LastName>Lawrence</LastName> <Locati

我有一个现有的XML文件,我想在不改变格式的情况下附加它。现有文件如下所示:

<Clients>
  <User username="farstucker">
    <UserID>1</UserID>
    <DOB />
    <FirstName>Steve</FirstName>
    <LastName>Lawrence</LastName>
    <Location>NYC</Location>
  </User>
</Clients>
我曾考虑过使用XmlDocument片段来附加数据,但我不确定是否可以在不破坏文件的情况下维护现有格式(和空标记)

非常感谢您给我的任何建议


编辑我更改了代码以读取原始XML,但文件不断被覆盖。

您应该使用XmlDocument类加载整个文件,在内存中修改它,然后写回内容以替换原始文件。别担心,它不会弄乱您的标记,您甚至可以使用
preservewitspace
属性()要求它在原始文档中保留不重要的空白

你可以试试这样的

        string fileLocation = "clients.xml";

        if (!File.Exists(fileLocation))
        {
            XmlTextWriter writer = new XmlTextWriter( fileLocation, null );
            writer.WriteStartElement( "Clients" );
            writer.WriteEndElement();
            writer.Close();
        }

        // Load existing clients and add new 
        XElement xml = XElement.Load(fileLocation);
            xml.Add(new XElement("User",
            new XAttribute("username", loginName),
            new XElement("DOB", dob),
            new XElement("FirstName", firstName),
            new XElement("LastName", lastName),
            new XElement("Location", location)));
        xml.Save(fileLocation);
这应该可以让您开始了,只要用您正在使用的变量替换变量,不要忘记添加System.Xml.Linq名称空间


如果您仍然有问题,请发回到这里,我们会帮助您解决。

如果您想使用序列化(意味着您有一个数据对象要序列化为XML并附加到现有XML文件),您可以使用此通用方法
SerializeAppend
。它正是你所需要的。我还为任何可能受益的人添加了另外两种方法

public static void Serialize<T>(T obj, string path)
{
    var writer = new XmlSerializer(typeof(T));

    using (var file = new StreamWriter(path))
    {
        writer.Serialize(file, obj);
    }
}


public static T Deserialize<T>(string path)
{
    var reader = new XmlSerializer(typeof(T));
    using (var stream = new StreamReader(path))
    {
        return (T)reader.Deserialize(stream);
    }

}

public static void SerializeAppend<T>(T obj, string path)
{
    var writer = new XmlSerializer(typeof(T));

    FileStream file = File.Open(path, FileMode.Append, FileAccess.Write);

    writer.Serialize(file, obj);

    file.Close();
}
publicstaticvoid序列化(T对象,字符串路径)
{
var writer=新的XmlSerializer(typeof(T));
使用(var文件=新StreamWriter(路径))
{
序列化(文件,obj);
}
}
公共静态T反序列化(字符串路径)
{
var reader=新的XmlSerializer(typeof(T));
使用(变量流=新的流读取器(路径))
{
返回(T)读取器。反序列化(流);
}
}
公共静态void序列化附加(T对象,字符串路径)
{
var writer=新的XmlSerializer(typeof(T));
FileStream file=file.Open(路径,FileMode.Append,FileAccess.Write);
序列化(文件,obj);
file.Close();
}

我同意kicsit所说的,除了他说的“XmlDocument”部分之外,您希望使用XDocument和Linq to XML,因为它更友好、更易于使用。有一种从文件读取文档的静态加载方法和一种等效的保存方法。我相信大多数问题并没有说明他们使用的是.NET的哪个版本。LINQ在2.0或以前的版本中不存在。请不要使用
新的XmlTextWriter()
。自.NET2.0以来,它一直被弃用。改为使用
XmlWriter.Create()
。这样,它将再次附加相同的命名空间。。它不会附加到最后一个子节点,但只会附加到文档末尾
public static void Serialize<T>(T obj, string path)
{
    var writer = new XmlSerializer(typeof(T));

    using (var file = new StreamWriter(path))
    {
        writer.Serialize(file, obj);
    }
}


public static T Deserialize<T>(string path)
{
    var reader = new XmlSerializer(typeof(T));
    using (var stream = new StreamReader(path))
    {
        return (T)reader.Deserialize(stream);
    }

}

public static void SerializeAppend<T>(T obj, string path)
{
    var writer = new XmlSerializer(typeof(T));

    FileStream file = File.Open(path, FileMode.Append, FileAccess.Write);

    writer.Serialize(file, obj);

    file.Close();
}