2013-04-17 7 views
-1

Я хочу использовать регулярное выражение, чтобы получить код авиакомпании между <AirlineCode> и </AirlineCode> тегами.Регулярное выражение - как совместить значение xml

Мне нужны только теги <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(); 
     } 
+8

Почему бы не использовать 'XDocument'? –

+6

По какой причине вы не можете использовать парсер XML? LINQ to XML ('XDocument'), например? – Oded

+0

было бы проще w/xdoc и xpath, но это, к сожалению, не может быть и речи из-за обстоятельств. – Laguna

ответ

2

В общем, это плохая идея попробовать синтаксический анализ XML с помощью регулярных выражений. Причина в том, что регулярное выражение недостаточно выразительно, даже с обратными ссылками и т. Д. Вопросы, связанные с комментариями, заслуживают внимания, чтобы понять, почему это вообще плохая идея.

Сказанное может быть успешным, если вы точно знаете формат своего файла, и если вы тоже хотите провести небольшой синтаксический анализ без регулярных выражений.

В вашей ситуации, у вас есть по существу:

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

И вы хотите, чтобы все <AirlineCode> тегов, которые происходят в пределах <Flight> тегов.

Способ решения этой проблемы состоит в том, чтобы извлечь теги <Flight> и их содержимое одним регулярным выражением, а затем использовать другое регулярное выражение для извлечения тегов <AirlineCode> из тех извлеченных тегов <Flight>. Не пытайтесь делать это в одном регулярном выражении. Вы не добьетесь успеха.

Если ваши данные действительно такие простые, то это сработает. Я не буду говорить, что рекомендую этот подход. Слишком много вещей, которые могут пойти не так. Форматы данных имеют тревожную тенденцию к изменению, и это хрупкое решение регулярного выражения, вероятно, сломается, если формат немного изменится. Решение XML-парсера будет гораздо более надежным.

Смежные вопросы