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

Java 如何使用Shell脚本从XML有效负载中提取值,java,shell,unix,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>

我有一个预定义格式的运行时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,并使用shell脚本将其分配给以逗号分隔的变量

我尝试了下面几行,但它没有返回整个测试方法标记

   failedTC=`grep "test-method.*FAIL" results.xml | sed -e 's/^.*test-instance-name="(.*)-----.*/\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']测试值节点是否包含该特定字符串


sed命令提取想要的字符串。

您的文件不是有效的XML。这是一个很大的负载。我不能在这里上传整个有效负载。因此,我只需要在需要提取值的地方进行切割。我建议在您的示例中添加一个根节点。当然。我也这么做了。我建议使用XML/HTML解析器xmlstarlet,例如,在Jenkins中没有标识xmlstarlet。是否可以使用bash命令获取当前的整个XML值。就像整个。。。地位=FAIL@ArrchanaMohan您可能需要在您的Jenkins主机上安装该工具…它是remote box。我无法在那里安装工具。请给我一些建议。我在下面几行使用了它,但它没有按预期返回示例:failedTC=`grep test method.*FAIL results.xml | sed-e's/^.*测试实例名称=.*-.*/\1/',但它没有返回问题之前的整个标记值
   <test-method status="FAIL" name="flowVISA" duration-ms="843329" data-provider="533w43werwer" finished-at="2018-11-01T23:30:48Z">
xmlstarlet sel -T -t -c "test-results/test-method[@status='FAIL']/params/param/value[contains(.,'testId')]" file | sed -n 's/.*testId=\([^,]\+\),.*/\1/p'