正则表达式 - 如何匹配xml值

时间:2013-04-17 18:28:32

标签: c# .net regex

我想使用正则表达式来获取<AirlineCode></AirlineCode>代码之间的航空公司代码。

我只想要<AirlineCode>标记中包含<Flight>标记的值。外面有更多<AirlineCode>个标签,我不想要它们的航空公司价值。

我尝试了下面的正则表达式,但无论提到的位置考虑因素,它都给了我所有的航空公司代码。请帮忙。

        var regex = new Regex(@"<AirlineCode>(.*?)</AirlineCode>", RegexOptions.IgnoreCase);

        Match m = regex.Match("<PNRViewRS><AirGroup><Flight CnxxIndicator=\"N\"><Arrival></Arrival><Carrier><AirlineCode>DL</AirlineCode></Carrier></Flight><Flight CnxxIndicator=\"N\"><Arrival></Arrival><Carrier><AirlineCode>AA</AirlineCode></Carrier></Flight></AirGroup></PNRViewRS>");
        int matchCount = 0;
        while (m.Success)
        {
            Console.WriteLine("Match" + (++matchCount));
            for (int i = 1; i <= 2; i++)
            {
                Group g = m.Groups[i];
                //do stuff...
            }
            m = m.NextMatch();
        }

1 个答案:

答案 0 :(得分:2)

通常,尝试使用正则表达式解析XML是个坏主意。原因是正则表达式的表达力不够,即使使用反向引用也是如此。评论中链接的问题值得一读,以了解为什么这通常是一个坏主意。

也就是说,如果您确定知道文件的格式,并且您愿意进行一些非正则表达式解析,那么您可以获得成功。

在你的情况下,你基本上有:

<Flight>
    <AirlineCode>
    </AirlineCode>
<Flight>
<AirlineCode>
</AirlineCode>
<Flight>
    <AirlineCode>
    </AirlineCode>
<Flight>

您希望<AirlineCode>代码中出现的所有<Flight>代码。

解决此问题的方法是使用一个正则表达式提取<Flight>标记及其内容,然后使用另一个正则表达式从提取的<AirlineCode>标记中提取<Flight>标记。不要尝试在单个正则表达式中执行此操作。你不会成功。

如果您的数据真的那么简单,那么这将有效。我不会说我推荐这种方法。有太多事情可能出错。数据格式具有令人沮丧的变化趋势,如果格式变化甚至一点点,那么脆弱的正则表达式解决方案可能会破裂。 XML解析器解决方案将更加健壮。