从xml文件获取数据并将其与文本文件进行比较

时间:2015-05-13 08:55:08

标签: c# xml streamreader system.io.file

所以我有两个文件:mot文件和xml文件。我需要对这些文件执行的操作是从xml文件中读取数据并将其与mot文件(如果存在)进行比较。这是一般的想法。

  

在其他任何事情之前,对于那些不熟悉什么的人   文件是(我也不太了解它,只是基础知识)...
  (From Wikipedia)一个mot文件(或摩托罗拉S-Record   file)是一种以ASCII Hex文本形式传送二进制信息的文件格式   (from another source) S记录文件由a组成   特殊格式的ASCII字符串序列。 S记录   将小于或等于78个字节的长度。

     

S-Record的格式为:
  S |输入|记录长度|地址(起始地址)|数据|校验
  (例如S21404200047524D5354524D0000801410AA5AA555F9)
  ([解析] S2 14 042000 47524D5354524D0000801410AA5AA555 F9)

具体的想法是我在地址0x042000~0x04200F中分配了数据AA BB CC DD等。在xml中写的是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<record>
  <File name="Test.mot">
    <Address id="042000">
    <Data>AA</Data>
  </Address>
  </File>
</record>
<record>
  <File name="Test.mot">
    <Address id="042001">
      <Data>BB CC DD</Data>
    </Address>
  </File>
</record>
<record>
  <File name="Test.mot">
    <Address id="042004">
      <Data>EE FF</Data>
    </Address>
  </File>
</record>

然后程序将从XML获取数据和地址,并在.mot文件中搜索任何命中。因此,如果一个mot文件有一个记录S214042000AABBCCDDEEFF01234567891A2B3C4D5EF9,那么这应该与xml中的内容匹配。结果为true,或1.如果xml中的任何内容没有匹配,则返回false或0。

现在的问题是我对C#的熟悉程度要低得多,尽管我对两者都有一点点经验。我最初认为它会是这样的:

using (StreamReader sr = new StreamReader("Test.mot"))
{
     String line =String.Empty;
     while ((line = sr.ReadLine()) != null)
     {
         if (line.Contains("042004") & line.Contains("EE FF"))
         {
             Console.WriteLine("Success");
         }
         else
         {
             Console.WriteLine("Failure");
         }
     }
}

但显然,它并没有达到我的预期。 Failure不断涌现。我是否正确使用StreamReader来读取.mot文件?关于XML文件,XMLDocument会工作吗?如何从xml获取数据并将其与.mot文件进行比较?有人可以告诉我如何完成这项工作或提供指导如何正确地开始。

如果我对任何事情都不清楚,请告诉我。

编辑:

我想到了一个主意。不过,我不确定它是否可行。假设程序将读取mot S-Record文件,它将识别记录的类型。从那里,文件中列出的每条记录行都将按照下面的示例进行细分:

sample record line: "S214042000AABBCCDDEEFF01234567891A2B3C4D5EF9"  
S2 - type w/c means there would be a 3-byte address  
14 - record length  
F9 - checksum  
042000 - AA  
042001 - BB  
042002 - CC  
042003 - DD  
...  
04200F - 5E  

有了这个新列表,我想或者我希望程序更容易使用XML中的数据在mot文件中找到它。

告诉我这是否有效,或者是否有其他选择。

1 个答案:

答案 0 :(得分:0)

当我错误的时候纠正我,因为它充满了假设:

XML仅在mot文件下提供数据包的起始值:

          ||||||||||||
S214042000AABBCCDDEEFF01234567891A2B3C4D5EF9
          AABBCCDDEEFF

您可以读出xml并将每条记录放在记录类中

public class Record
{
    string FileName{get;set;}
    string Id {get;set;}
    string Data {get;set;}
    public Record(){} //default constructor
}

使用XmlDocument类可以读出xml。

类似的东西:

var document = new XmlDocument();
document.LoadXml("your.xml");

var records = document.SelectNodes("record");
var recordList = new List<Record>();
foreach(var r in records)
{
    var file = r.SelectSingleNode("file");
    var fileName = file.Attributes["name"].Value;
    var address = file.SelectSingleNode("Address");
    var id = address.Attributes["id"].Value;
    var data = address.SelectSingleNode("Data").InnerText.Replace(" ", "");

    recordList.Add(new Record{FileName = fileName, Id = id, Data = data});
}

之后,您可以按位置读出mot文件的每一行: 因为042000的位置总是5-10个字符

var fn = "Test.mot";
using (StreamReader sr = new StreamReader(fn))
{    
     var record = recordList.Single(r=> r.FileName);
     String line =String.Empty;
     while ((line = sr.ReadLine()) != null)
     {        

         if (line.SubString(4,6) == record.Id && line.SubString(10, record.Data.Length) == record.Data)
         {
             Console.WriteLine("Success");
         }
         else
         {
             Console.WriteLine("Failure");
         }
     }
}

让我知道它是否有点帮助你