簡體   English   中英

如何使用 Shell 腳本從 XML 負載中提取值

[英]How to extract value from XML payload using Shell script

我有運行時 XML 文件,它具有預定義的格式並且它是在 Jenkins 工作區中創建的。 我只想使用 shell 腳本解析 XML 負載。

示例有效負載:

 <test-results>
     <test-method status="FAIL" name="flowVISA" duration-ms="843329" data-provider="533w43werwer" finished-at="2018-11-01T23:30:48Z">
       <params>
         <param index="0">
           <value>
           <![CDATA[ account_number:22988419 ]]>
           </value>
         </param>
         <param index="1">
           <value>
           <![CDATA[ txn_id:6wdadfsad2134330L ]]>
           </value>
         </param>
         <param index="2">
           <value>
           <![CDATA[ amount:1100 ]]>
           </value>
          </param>
          <param index="3">
            <value>
            <![CDATA[ currency:USD ]]>
            </value>
          </param>
          <param index="4">
            <value>
            <![CDATA[Id:11a09 ]]>
            </value>
          </param>
          <param index="5">
            <value>
            <![CDATA[Name:Consumer [testId=AS1-TC2, description=Txn amount; wallet -Bal, BA,CC,VISA Credit; Consumer - CC;No other preference set]]]>
            </value>
          </param>
        </params>
     </test-method>
     <test-method status="PASS" name="flowVISA" duration-ms="843329" data-provider="533w43werwer" finished-at="2018-11-01T23:30:48Z">
         <params>
           <param index="0">
              <value>
              <![CDATA[ account_number:22988419 ]]>
              </value>
           </param>
           <param index="1">
             <value>
             <![CDATA[ txn_id:6wdadfsad2134330L ]]>
             </value>
           </param>
        </params>
      </test-method>
      <test-method status="FAIL" name="flowVISA" duration-ms="843329" data-provider="533w43werwer" finished-at="2018-11-01T23:30:48Z">
        <params>
           <param index="0">
              <value>
              <![CDATA[ account_number:22988419 ]]>
              </value>
           </param>
           <param index="1">
              <value>
              <![CDATA[Name:Consumer [testId=AS1-TC3, description=Txn amount; wallet -Bal, BA,CC,VISA Credit; Consumer - CC;No other preference set]]]>
              </value>
           </param>
         </params>
      </test-method>
  </test-results>

上面的有效負載如果“失敗”,我必須讀取測試方法的狀態,然后我需要從該特定測試方法中獲取“testId”值。 上面的有效負載我有 3 個測試方法,只有兩個狀態為 Failed 我需要獲取兩個測試 ID 並分配給變量,如下所示

預期輸出:

  fetchResult = AS1-TC2,AS1-TC3

我只需要獲取失敗的測試方法的“testId”,並將其分配給使用 shell 腳本以逗號分隔的變量。

我嘗試了以下幾行,但它沒有返回整個測試方法標簽

   failedTC=`grep "test-method.*FAIL" results.xml | sed -e 's/^.*test-instance-name="(.*)-----.*/\1/'

輸出:

   <test-method status="FAIL" name="flowVISA" duration-ms="843329" data-provider="533w43werwer" finished-at="2018-11-01T23:30:48Z">

我想為 status="FAIL" 返回整個<test-method> ... </test-method>

任何線索....

您可以使用以下 xmlstarlet 和 sed 命令:

xmlstarlet sel -T -t -c "test-results/test-method[@status='FAIL']/params/param/value[contains(.,'testId')]" file | sed -n 's/.*testId=\([^,]\+\),.*/\1/p'

-T :原始測試(沒有 XML 節點)。
-t : 模板
-c : Xpath 表達式

[@status='FAIL']是對屬性status的測試。

value[contains(.,'testId')]測試value節點是否包含該特定字符串。

sed命令提取所需的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM