如何使用Shell脚本从XML有效负载中提取值

时间:2018-11-13 05:27:09

标签: java shell unix

我有运行时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>

以上有效负载,如果“ FAIL”失败,我必须读取测试方法的状态,然后我需要从该特定测试方法中获取“ testId”值。上面的有效负载我有3种测试方法,只有两种状态为Failed我需要同时获取Test 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">

我想返回状态{FAIL“的整个<test-method> ... </test-method>

任何线索。...

1 个答案:

答案 0 :(得分:0)

您可以使用以下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命令提取所需的字符串。