[英]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
...
地址从第3个字节开始。 是的,将数据与这些线段进行比较。
您可以使用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;}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.