Как создать новую строку с элементом xml unity?

Рейтинг: 0Ответов: 1Опубликовано: 09.04.2023

мне нужно создавать новый элемент на новой строке в файле xml, но вместо этого, при вызове функции у меня переписывается весь файл

мой код:

using UnityEngine;
using System.Xml.Linq;
using System.IO;

public class playerpref : MonoBehaviour
{
    private string path;
    private void Awake()
    {
        path = Application.dataPath + @"/Resources/UserData.xml";
    }

    public XElement GetElement()
    {
        XAttribute one = new XAttribute("one", "123");
        XAttribute two = new XAttribute("two", "123");

        XElement element = new XElement("userDate", "user", one, two);

        return element;
    }

    public void Save()
    {
        XElement root = new XElement("root");
        root.Add(GetElement());
        Debug.Log(root);

        XDocument saveDoc = new XDocument(root);
        File.WriteAllText(path, saveDoc.ToString());
        Debug.Log(path);
    }
}

Сейчас при двойном вызове функции строение xml файла такое:

<root>
  <userDate one="123" two="123">user</userDate>
</root>

Мне нужно, что бы строение выглядело так:

<root>
  <userDate one="123" two="123">user</userDate>
  <userDate one="123" two="123">user</userDate>
</root>

как это реализовать?

Ответы

▲ 0Принят

Можно создать такую структуру данных.

using System.Xml;
using System.Xml.Serialization;
public class userRecord
{
    [XmlAttribute]
    public string one;
    [XmlAttribute]
    public string two;

    public userRecord() { }

    public userRecord(string one, string two)
    {
        this.one = one;
        this.two = two;
    }
}

Написать вот такой метод сохранения

private void Save(string path, List<userRecord> records)
{
    using (Stream fs = File.Create(path))
    {
        XmlSerializer xs = new XmlSerializer(typeof(List<userRecord>), new XmlRootAttribute("root"));
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        xs.Serialize(fs, records, ns);
    }
}

Создать тестовые данные

List<userRecord> records = new List<userRecord>();
records.Add(new userRecord("123", "456"));

Вот так сохранить

Save("UserData.xml", records);

На выходе получится файл

<?xml version="1.0" encoding="utf-8"?>
<root>
  <userRecord one="123" two="456" />
</root>

Теперь нужен метод загрузки данных из файла

private List<userRecord> Load(string path)
{
    using (Stream fs = File.OpenRead(path))
    {
        XmlSerializer xs = new XmlSerializer(typeof(List<userRecord>), new XmlRootAttribute("root"));
        return (List<userRecord>)xs.Deserialize(fs);
    }
}

Готово, можно загрузить, добавить строку и сохранить обратно

List<userRecord> records = Load("UserData.xml");
records.Add(new userRecord("789", "012"));
Save("UserData.xml", records);

Получится вот такой XML

<?xml version="1.0" encoding="utf-8"?>
<root>
  <userRecord one="123" two="456" />
  <userRecord one="789" two="012" />
</root>

Примеры сериализации посложнее