我是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>
另一个问题是哪个库以及哪种检索数据的方法最好。我看到它的方式,我有两个选项来处理文件,要么我在磁盘上读了两遍(第一次读取文件名,第二次查找模型号),直接从中读取/删除条目,或者我将所有数据读入内存(可能是一个类的列表),如果有任何更改,则重写文件。我应该走哪条路?我应该使用哪个库?
答案 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点更新我的文件
我希望这对你有所帮助,但我需要更多信息才能提供更多代码。