Нужна команда регулярного выражения, чтобы найти значение в файле xml - PullRequest
1 голос
/ 29 мая 2020

У меня есть большой файл xml, который находится в операторе регистрации. Я использую Splunk для извлечения значений из файла xml. Мне нужно использовать регулярное выражение, чтобы найти эти значения, потому что я не могу изменить файлы конфигурации. Я запросил изменение, но оно ожидается ... Это пример файла xml:

<?xml version="1.0" encoding="UTF-8"?>
<tmsTrip xmlns="http://ground.fedex.com/schemas/linehaul/trip" xmlns:ns2="http://ground.fedex.com/schemas/linehaul/TMSCommon">
   <tripNumber>129271010</tripNumber>
   <tripLegNumber>1</tripLegNumber>
   <origin>
      <ns2:numberCode>5902</ns2:numberCode>
  ...many more fields....
   </origin>
   <destination>
      <ns2:numberCode>5087</ns2:numberCode>
   ...many more fields....
   </destination>
  ...many more fields....
   <purchasedCost>
      <purchasedCostTripSegment>
         <purchCostReference>2644025</purchCostReference>
         <carrier>BNSF</carrier>
         <vendorType>RAIL</vendorType>
         <carrierTrailerType>53PC</carrierTrailerType>
         <origin>
            <ns2:numberCode>4022</ns2:numberCode>
...many more fields....
         </origin>
         <destination>
            <ns2:numberCode>4040</ns2:numberCode>
...many more fields....     
         <stopOff>
            <ns2:stopOffLocation>
               <ns2:numberCode>9996</ns2:numberCode>
...many more fields....       
            </ns2:stopOffLocation>
         </stopOff>
         <schedDispatchDate>2020-05-27T05:00:00.000Z</schedDispatchDate>
...many more fields....
      </purchasedCostTripSegment>
      <purchasedCostTripSegment>
         <purchCostReference>2644025</purchCostReference>
         <carrier>NS</carrier>
         <vendorType>RAIL</vendorType>
         <carrierTrailerType>53PC</carrierTrailerType>
         <origin>
            <ns2:numberCode>4061</ns2:numberCode>
...many more fields....
         </origin>
         <destination>
            <ns2:numberCode>4040</ns2:numberCode>
...many more fields....         
         </destination>
         <stopOff>
            <ns2:stopOffLocation>
               <ns2:numberCode>4040</ns2:numberCode>
 ...many more fields....      
            </ns2:stopOffLocation>
         </stopOff>
         <schedDispatchDate>2020-05-27T05:00:00.000Z</schedDispatchDate>
 ...many more fields....     
      </purchasedCostTripSegment>
   </purchasedCost>
</tmsTrip>

Мне нужно указать ns2: numberCode для источника и назначения для каждого из приобретенныхCostTripSegment .

Я делаю это в Splunk, поэтому регулярное выражение может быть специфическим для Splunk. Я могу найти исходные и конечные точки, если использую функцию mvindex () и подсчитываю экземпляры ns2: numberCode . Но тогда это отдельные поля, которые не отображаются четко в таблице. Это команда регулярного выражения, которая вернет первое происхождение PurchaseCostTripSegment:

| rex max_match=0 "\<ns2\:numberCode\>(?P<location>[^\<]+)" | eval Segment1_Origin =  mvindex(location, 7)

Мне нужно регулярное выражение, которое вернет все источники PurchaseCostTripSegments. Я пробовал это:

| rex max_match=0 "\<purchasedCostTripSegment\>*\<origin\>*\<ns2\:numberCode\>(?P<Origin>[^\<]+)"

Не вернул никакого значения. Как я могу написать регулярное выражение, чтобы найти все значения ns2: numberCode, которые находятся в этом разделе xml:

     <purchasedCostTripSegment>
             <purchCostReference>2644025</purchCostReference>
             <carrier>BNSF</carrier>
             <vendorType>RAIL</vendorType>
             <carrierTrailerType>53PC</carrierTrailerType>
             <origin>
                <ns2:numberCode>4022</ns2:numberCode>
</purchasedCostTripSegment>
      <purchasedCostTripSegment>
         <purchCostReference>2644025</purchCostReference>
         <carrier>NS</carrier>
         <vendorType>RAIL</vendorType>
         <carrierTrailerType>53PC</carrierTrailerType>
         <origin>
            <ns2:numberCode>4061</ns2:numberCode>
</purchasedCostTripSegment>

В приведенном выше примере я хочу вернуть значения 4022 и 4061,

1 Ответ

1 голос
/ 29 мая 2020

Вы можете использовать это как временное решение:

| rex max_match=0 "<purchasedCostTripSegment>[\s\S]*?<origin>\s*<ns2:numberCode>(?P<Origin>\d+)"

См. Демонстрацию регулярного выражения .

Подробности

  • <purchasedCostTripSegment> - некоторый буквальный текст
  • [\s\S]*? - ноль или более символов, как можно меньше
  • <origin> - некоторый текст
  • \s* - 0+ пробелов
  • <ns2:numberCode> - некоторый текст
  • (?P<Origin>\d+) - Именованная группа захвата (для Splunk это должна быть именованная группа): 1 или более цифр.
...