【问题标题】:How to extract value from XML payload using Shell script如何使用 Shell 脚本从 XML 有效负载中提取值
【发布时间】:2018-11-13 05:27:09
【问题描述】:

我有运行时 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 个测试方法只有两个有状态失败我需要同时获取测试 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" 返回整个 &lt;test-method&gt; ... &lt;/test-method&gt;

任何线索....

【问题讨论】:

  • 您的文件不是有效的 XML。
  • 这是一个很大的有效载荷。我不能在这里上传整个有效载荷。所以我只是在需要提取值的地方剪掉了。
  • 我建议在您的示例中添加一个根节点。
  • 当然。我也是这样做的。
  • 我建议使用 XML/HTML 解析器(例如 xmlstarlet)。

标签: java shell unix


【解决方案1】:

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

【讨论】:

  • 在 Jenkins 中未识别 xmlstartlet
  • 是否可以使用 bash 命令获取当前的整个 XML 值。像整个 ... for status=FAIL
  • @ArrcanaMohan 您可能需要在您的 Jenkins 主机上安装该工具...
  • 它是远程盒子。我无权在那里安装工具。请给我一些建议。我使用了下面的行,但它没有按预期返回示例: failedTC=`grep "test-method.*FAIL" results.xml | sed -e 's/^.*test-instance-name="(.*)-----.*/\1/' 但它不返回整个 标记值
  • 更新问题
猜你喜欢
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2018-06-29
  • 2016-12-04
  • 2019-03-27
  • 2021-01-25
相关资源
最近更新 更多