寻找有关在XML文件中存储,读取和动态更新数据的建议

时间:2015-05-09 19:03:00

标签: c# xml

我是C#的新手,我从未对XML做过任何事情。我的大部分经验是为微控制器编写的C代码,具有一些C / C ++和Linux脚本编写经验,但从来没有任何XML。

基本上,我在一个文件夹中有一堆固件更新文件,目前大约有50个,但是用户可能有多达一百个或更多,特别是如果他们不删除旧版本或者程序扩展到支持其他硬件。我的程序需要检查所有这些文件,从中解析一些数据,并以某种方式存储它以便快速查找。我想过只做一个CSV文件,但我想我可以在这个过程中学习一些关于XML的知识。

我的第一个问题是格式化数据。一个固件文件可能涵盖多个硬件型号,并且一个型号可以有多个版本的固件。程序启动时,需要列出当前XML文件中的所有文件名,并将它们与文件夹中的文件名进行比较。稍后,它需要找到具有正确型号名称的所有文件。我已经提出了几种不同的格式来存储数据,我目前倾向于选项2.

选项1:

<Model model="Model String">
    <FirmwareFile filename=foo.bar> 
        <Version> "1.2.3" </Version>
        <DateCode> "05082015" </DateCode>
    </FirmwareFile>
    <FirmwareFile filename=foo2.bar>
        [...]
    </FirmwareFile>
</Model>

选项2:

<FirmwareFile filename=foo.bar> 
    <Models>"Model A", "Model B"</Models> //probably not the right way to do this
    <Version> "1.2.3" </Version>
    <DateCode> "05082015" </DateCode>
</FirmwareFile>

另一个问题是哪个库以及哪种检索数据的方法最好。我看到它的方式,我有两个选项来处理文件,要么我在磁盘上读了两遍(第一次读取文件名,第二次查找模型号),直接从中读取/删除条目,或者我将所有数据读入内存(可能是一个类的列表),如果有任何更改,则重写文件。我应该走哪条路?我应该使用哪个库?

2 个答案:

答案 0 :(得分:1)

查看我的即用型 - 代码示例。

首先,您需要创建一对类来处理这些模型:

--random-sort

之后是保存和加载它的方法。

首先是//using System.Collections.Generic; public class Models { public List<Model> models { get; set; } } public class Model { public string name { get; set; } public List<FirmwareFile> firmwarefiles { get; set; } } public class FirmwareFile { public string filename { get; set; } public Version version { get; set; } public int datecode { get; set; } } 方法:

Load

第二个//using System.Xml; public Models Load() { Models ms = new Models(); ms.models = new List<Model>(); XmlDocument xml = new XmlDocument(); xml.Load(/*path to your file*/); foreach (XmlNode model in xml.LastChild.ChildNodes) { Model m = new Model(); m.firmwarefiles = new List<FirmwareFile>(); m.name = model.FirstChild.InnerText; foreach (XmlNode firmwarefile in model.LastChild.ChildNodes) { FirmwareFile f = new FirmwareFile(); f.filename = firmwarefile.ChildNodes[0].InnerText; Version v = new Version(); Version.TryParse(firmwarefile.ChildNodes[1].InnerText, out v); f.version = v; f.datecode = Convert.ToInt32(firmwarefile.ChildNodes[2].InnerText); m.firmwarefiles.Add(f); } ms.models.Add(m); } return ms; } 方法:

Save

//using System.Xml; public void Save(Models models) { using (XmlWriter writer = XmlWriter.Create(/*path to your config file*/)) { writer.WriteStartDocument(); writer.WriteRaw("\n"); writer.WriteStartElement("models"); foreach (Model m in models.models) { writer.WriteRaw("\n\t"); writer.WriteStartElement("model"); writer.WriteRaw("\n\t\t"); writer.WriteElementString("name", m.name); writer.WriteRaw("\n\t\t"); writer.WriteStartElement("firmwarefiles"); for (int i = 0; i < m.firmwarefiles.Count; i++) { writer.WriteRaw("\n\t\t\t"); writer.WriteStartElement("firmwarefile"); writer.WriteRaw("\n\t\t\t\t"); writer.WriteElementString("filename", m.firmwarefiles[i].filename); writer.WriteRaw("\n\t\t\t\t"); writer.WriteElementString("version", m.firmwarefiles[i].version.ToString()); writer.WriteRaw("\n\t\t\t\t"); writer.WriteElementString("datecode", m.firmwarefiles[i].datecode.ToString()); writer.WriteRaw("\n\t\t\t"); writer.WriteEndElement(); } writer.WriteRaw("\n\t\t"); writer.WriteEndElement(); writer.WriteRaw("\n\t"); writer.WriteEndElement(); } writer.WriteRaw("\n"); writer.WriteEndElement(); writer.WriteEndDocument(); } } 返回此类:

Save

基本用法:

<?xml version="1.0" encoding="utf-8"?>
<models>
    <model>
        <name>foo1</name>
        <firmwarefiles>
            <firmwarefile>
                <filename>foo1.firm</filename>
                <version>15.22.13.56</version>
                <datecode>30051982</datecode>
            </firmwarefile>
            <firmwarefile>
                <filename>foo2.firm</filename>
                <version>12.13.14</version>
                <datecode>12031967</datecode>
            </firmwarefile>
        </firmwarefiles>
    </model>
</models>

答案 1 :(得分:0)

对于datetime,您也可以使用unix时间戳。 我用于以前的xml项目:

XmlDocument xml = new XmlDocument(); //Get the XML from remote URL
xml.Load(/*url or location*/);
foreach (XmlNode firmwareFile in xml)
{
    //do something
}

获取xml节点的内部文本:

string inner = lesson["yourxmlnode"].InnerText;

每天凌晨2点更新我的文件

我希望这对你有所帮助,但我需要更多信息才能提供更多代码。