将数据从 XML 提取到列表<>

Extracting Data from XML to List<>

我有这个 XML 文件:

<?xml version="1.0" encoding="utf-8" ?>
<Record>
  <File name="1.mot">
    <Line address="040004" data="0720" />
    <Line address="040037" data="31" />
    <Line address="04004C" data="55AA55AA" />
  </File>
  <File name="2.mot">
    <Line address="00008242" data="06" />
    <Line address="00008025" data="AFC8" />
    <Line address="00009302" data="476F6C64" />
  </File>
</Record>

我想做的是从 XML 中提取信息并将其转换为列表。虽然我有点不知道从哪里开始,如何开始。我已经用谷歌搜索了样本和问题,下面的代码是我到目前为止所构建的。我什至不确定这段代码是否适合我想要发生的事情。该列表将用于程序中的某种查找。就像在文件 1.mot 中一样,程序会读取 1.mot,读取 xml 文件,解析两个文件,从 xml 文件中提取信息,然后执行搜索功能来验证如果 xml 中的信息存在于 1.mot 中。

XElement xmlReqs = XElement.Load("XMLFile1.xml");
List<Requirement> reqs = new List<Requirement>();
foreach (var xmlReq in xmlReqs.Elements("File"))
{
    string name = xmlReqs.Attribute("name").Value);
    List<InfoLine> info = new List<InfoLine>();
    foreach (var xmlInfo in xmlReq.Elements("Line"))
    {
      string address = xmlProduct.Attribute("address").Value;
      string data = xmlProduct.Attribute("data").Value;
    }
reqs.Add(new Requirement(address, data));
}

我的一个朋友建议使用 int 数组或字符串数​​组然后使用这个 reqs.Find(val => val[0]==target) 但我不确定该怎么做。我不精通 linq,但我收集到的信息,它似乎非常引人注目和强大(?)。

无论如何,上面的代码可以工作吗?以及如何调用列表中的对象以用于程序的查找功能?

更新: 程序将与 xml 文件同时(或不)读取 1.mot 或 2.mot(取决于用户偏好,这就是为什么需要指定 xml 中的文件名的原因) . 1.mot 文件包含:

S0030000FC
S21404000055AA55AA072000010008000938383138D7
S21404001046305730343130302020202027992401B0
...

地址从第三个字节开始。所以是的,将数据与这些行进行比较。

您可以使用 XmlSerializer 来处理 XML 的读取。创建一些像这样的 类:

public class Record
{
    [XmlElement("File")]
    public List<File> Files { get; set; }
}

public class File
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("Line")]
    public List<Line> Lines { get; set; } 
}

public class Line
{
    [XmlAttribute("address")]
    public int Address { get; set; }

    [XmlAttribute("data")]
    public string Data { get; set; }
}

像这样反序列化:

var serializer = new XmlSerializer(typeof (Record));

using (var reader = XmlReader.Create("XMLFile1.xml"))            
{
    var record = (Record) serializer.Deserialize(reader);

    var first = record.Files.Single(f => f.Name == "1.mot");
    var second = record.Files.Single(f => f.Name == "2.mot");
}

您可以反序列化 xml 文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlSerializer xs = new XmlSerializer(typeof(Record));
            XmlTextReader reader = new XmlTextReader(FILENAME);
            Record record = (Record)xs.Deserialize(reader);

        }
    }
    [XmlRoot("Record")]
    public class Record
    {
        [XmlElement("File")]
        public List<File> files {get;set;}
    }
    [XmlRoot("File")]
    public class File
    {
        [XmlAttribute("name")]
        public string name { get; set; }
        [XmlElement("Line")]
        public List<Line> lines {get;set;}
    }
    [XmlRoot("Line")]
    public class Line
    {
        [XmlAttribute("address")]
        public string address {get;set;}
        [XmlAttribute("data")]
        public string data {get;set;}
    }
}
​