首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c#中扫描或解析电子客票以从中提取信息

如何在c#中扫描或解析电子客票以从中提取信息
EN

Stack Overflow用户
提问于 2013-12-09 19:22:44
回答 1查看 9K关注 0票数 1

我正在开发asp.net mvc。我正在尝试扫描或解析航班电子机票,以提取诸如确认号、航班号、航空公司名称、旅行开始日期和结束日期等信息。首先,我从我的电子邮件中阅读邮件,在那里我可以使用IMAP找到我的电子客票,例如,

代码语言:javascript
复制
using (Imap imap = new Imap())
{
    imap.Connect("imap.gmail.com", 993, true);
    imap.Login("***@gmail.com", "XXXX");
    imap.SelectInbox();
    List<long> uids = imap.Search(Flag.All);
    foreach (long uid in uids)
    {
       string eml = imap.GetMessageByUID(uid);
       IMail email = new MailBuilder().CreateFromEml(eml);
       ....
       ....
    }
}

实际上我的困难部分出现了,有很多航空公司都退出了,每个航空公司都遵循自己的设计或规范的电子客票外观,他们可能每3个月重新更新他们的电子客票,或者他们可以对每个航班的机票有自己的风格。所以这不是很好的标准,写下这样的条件

代码语言:javascript
复制
If AmericanAirlines:
....do stuff for AA....
Else If SouthAirlines:
....do stuff for AA....
..
..

首先,我教会了如何使用HtmlAgilityPack解析电子客票,因为所有电子客票都是使用HTML语言设计或准备的,所以我可以使用这个库来解析DOM元素并从中提取信息。但它会变得非常复杂,我需要写解析代码为航空公司机票。因此我决定使用正则表达式来匹配确认号和航空公司名称,如下所示:

代码语言:javascript
复制
 string code = "";
 Match match = Regex.Match(email.Text.Replace("*", ""), @"\s*((Record\s*Locator)|(Confirmation\s*[a-zA-Z]{0,4})|(AIR\s*Confirmation)|(Flight\s*Confirmation))(\s*)(\#*)(\s*)(\:*)(\s*)[A-Z0-9]{6}", RegexOptions.IgnoreCase);
 if (match.Success)
 {
     string s = Regex.Replace(match.Value, @"\\r\\n", "").Trim();
     code = s.Substring(s.Length - 6);
     if (!confirmcodes.Any(m => m == code))
        confirmcodes.Add(code);
  }
  string airline = "";
  Match airlinematch = Regex.Match(email.Text.Replace("*", ""), @"\s*(.*)\s*((Air\s*lines\s*)|(Air\s*ways\s*))", RegexOptions.IgnoreCase);
  if (airlinematch.Success)
  {
      string s = Regex.Replace(airlinematch.Value, @"\\r\\n", "").Trim();
      airline = airlinematch.Groups[0].Value;
  }

上述条件可能只满足某些航空公司,如果机票是以非常不寻常的方式设计的,条件将被打破。因此,请指导我更好的策略,以扫描适合任何类型的航空公司的机票的航班电子机票。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-12-10 04:31:33

我将使用更灵活的两步系统:

步骤1:查找并提取整个信息

我会使用解析器来定位信息。我会要求解析器将此信息提取为文本。

代码语言:javascript
复制
HtmlParser parser = new HtmlParser();
parser.loadHtml(...);

String information = parser.select('div#information').toString();

Step2:分析提取的信息

在XML文件的帮助下,我会在其中放入用于提取所需信息的各种正则表达式。

我的文件将如下所示:

代码语言:javascript
复制
<regexes>
    <regex name="AA Airlines">
        <name><![CDATA[AA\s+\w+]]></name>
        <seat><![CDATA[\d+]]></seat>
        ...
    </regex>

    <regex name="South Airlines">
        <name><![CDATA[South\s*[a-z]]]></name>
        <seat><![CDATA[\d{2}-\d{4}-\d+]]></seat>
        ...
    </regex>

    ...
</regexes>

然后,在我的C#代码中,我将解析上面的小配置文件,并根据每个“变体”检查我的information。稍后,如果出现新的变体,我只需更新我的小配置文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20469349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档