首页 > 解决方案 > 如何保存/读取列表在 XML 中?

问题描述

我尝试如下保存/读取 XML 中的列表。

类创建列表:

public class CreateList
{
    public List<string> createListBuild()
    {
        var itemsList = new List<string> { "item1", "item2", "item3" };

        return itemsList;
    }
}

类 ConfigWrapper:

[XmlRoot(Namespace = "", ElementName = "collection")]
public class ConfigWrapper
{
    [XmlElement("item")]
    public List<string> Items { get; set; }
}

类 WriteReadList:

public class WriteReadList
{
    // Запись в XML
    public void WriteXML(List<string> itemsList)
    {   
        var cfgIn = new ConfigWrapper { Items = itemsList };
        var xs = new XmlSerializer(typeof(ConfigWrapper));
        //string fileContent = "ListXML";
        // string fileContent = @".\ListXML.xml";
        string fileContent = @".\ListXML.xml";

        using (var sw = new StringWriter())
        {
            xs.Serialize(sw, cfgIn);
            fileContent = sw.ToString();
            // Console.WriteLine(fileContent);
        }
    }

    public void ReadXML(string fileContent)
    {
        ConfigWrapper cfgOut = null;

        using (var sr = new StringReader(fileContent))
        {
            var xs = new XmlSerializer(typeof(ConfigWrapper));

            cfgOut = xs.Deserialize(sr) as ConfigWrapper;
            // cfgOut.Dump(); //view in LinqPad
            // if (cfgOut != null)
            // yields 'item2'
            // Console.WriteLine(cfgOut.Items[1]);
        }
    }
}

我使用以下按钮实现逻辑:

List<string> listWork;
CreateList createList;

private void button1_Click(object sender, EventArgs e)
{
    listWork = createList.createListBuild();
}

// Сохранить в XML
private void button3_Click(object sender, EventArgs e)
{
    // Конфигурация обёртки
    ConfigWrapper config = new ConfigWrapper();
    config.Items = listWork;

    WriteReadList writeReadList = new WriteReadList();
    writeReadList.WriteXML(config.Items);
}

我无法使代码工作如何做正确的事情?如何List<string>从位于“* .exe”项目文件旁边的 XML 文件中进行保存/读取?或者如何更容易地做到这一点?

标签: c#

解决方案


使用时必须传递xml文件的完整路径StringWriter

例如:

//get path of the .exe
string executableLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

//Combine the name of the xml file to get the path of the xml
string xmlPath = Path.Combine(executableLocation, "ListXML.xml");

using (var sw = new StringWriter(xmlPath))
{
     xs.Serialize(sw, cfgIn);
}

推荐阅读