如何将XML文件与C#中的设备字符串进行比较?

时间:2015-04-23 17:29:50

标签: c# xml

对不起格式化 - 设备字符串充满了返回和换行符

我有来自设备的这个字符串;

1) Port: 11 Phone: 18005555555  IP: 192.168.0.1\r\n\r 
2) Port: 11 Phone: 18005551234  IP: 192.168.0.1\r\n\r 
3) Port: 0     Phone: 0         IP: 0.0.0.\r\n\r 
4) Port: 0     Phone: 0         IP: 0.0.0.\r\n\r 
5) Port: 0     Phone: 0         IP: 0.0.0.\r\n\r\r\n 

我有这个XML文件,它有我想比较字符串的有效数据。

<?xml version="1.0" encoding="utf-8"?>
<Data>
  <USA>
    <Speed2G>
      <PhoneNumber1>
        <Port>11</Port>
        <Phone>18005555555</Phone>
        <IP>192.168.0.1</IP>
      </PhoneNumber1>
      <PhoneNumber2>
        <Port>11</Port>
        <Phone>18005551234</Phone>
        <IP>192.168.0.1</IP>
      </PhoneNumber2>
      <PhoneNumber3>
        <Port>0</Port>
        <Phone>0</Phone>
        <IP>0.0.0.</IP>
      </PhoneNumber3>
      <PhoneNumber4>
        <Port>0</Port>
        <Phone>0</Phone>
        <IP>0.0.0.</IP>
      </PhoneNumber4>
      <PhoneNumber5>
        <Port>0</Port>
        <Phone>0</Phone>
        <IP>0.0.0.</IP>
      </PhoneNumber5>
    </Speed2G>
  </USA>
</Data>

我该如何解决这个问题?我本身没有任何代码,因为我不知道从哪里开始。字符串中的值需要与xml的innertext匹配。

3 个答案:

答案 0 :(得分:1)

这里的基本想法是创建一个名为电话号码的类,如下所示:

public partial class PhoneNumber
{
    public int Ordinal;
    public int Port;
    public string Phone;
    public string IPaddress;

    public override bool Equals(Object obj)
    {
        if (obj == null)
        {
            return false;
        }

        PhoneNumber pn = obj as PhoneNumber;
        if ((object)pn == null)
        {
            return false;
        }
        return (this.Ordinal == pn.Ordinal) && (this.Port == pn.Port) && (this.Phone == pn.Phone) && (this.IP == pn.IP); 
    }
}

然后将您的数据反序列化为List<PhoneNumber>。对于XML,我会将XML数据加载到XDocument并以这种方式解析,对于文本数据,您可能希望它在某种StreamReader中。代码可能会像这样......

public List<PhoneNumber> PhoneNumberFromXML(XDocument xd)
{
    List<PhoneNumber> lpn = new List<PhoneNumber>();
    foreach (XElement el in xd.Root.Descendants("Speed2G").First().Elements())
    {
        PhoneNumber pn = new PhoneNumber();
        //... logic to parse the individual elements into your class
        lpn.Add(pn);
    }
    return lpn;
}

另一种方法,如

public List<PhoneNumber> PhoneNumberFromDevice(Stream deviceText)
{
    List<PhoneNumber> lpn = new List<PhoneNumber>;
    using (StreamReader sr = new StreamReader)
    {
        while (sr.Peek() > 0)
        {
            string line = sr.ReadLine();
            PhoneNumber pn = new PhoneNumber();
            // parse line into phone number
            lpn.Add(pn); 
        }
    }
    return lpn;
}

显然,解析逻辑将在这里开展一些工作。您可以考虑将其合并到该类的构造函数中;您也可以尝试使用XmlSerializer编写一个更直接序列化到/来自XML的类,但这可能比这个用例需要更多的努力。

答案 1 :(得分:0)

从Xml中创建文本和集合中的集合,而不是比较这些集合。

答案 2 :(得分:0)

我会调查使用xpath将XML消息解构为Object属性。