Shell脚本从XML响应中提取变量的值

时间:2016-06-14 20:20:18

标签: bash shell unix xml-parsing

我有一个XML响应,每当BillPlan =“UBM - A / A”时我需要从中提取ObjDevice的值。你能帮我用shell脚本做同样的事吗

    <Txn>
            <TxnName>Spectrum-AlertSite-Component_spectrum.engprod_InstantUpgradeEdge_GetProductOffersByAccount_getProductOffersByAccountValid</TxnName>
            <TxnDetail Monitor="y" Notify="y" PingError="n"
  TraceError="y" Interval="5" TimeOut="300"
  ObjDevice="318373" BillPlan="UBM - A/A" MaxSteps="50"

 />
        </Txn>
        <Txn>
            <TxnName>Spectrum-AlertSite-Component_spectrum.engprod_InstantUpgradeEdge_GetProductOffersByAccount_getProductOffersByAccountValid</TxnName>
            <TxnDetail Monitor="y" Notify="y" PingError="n"
  TraceError="y" Interval="5" TimeOut="300"
  ObjDevice="318377" BillPlan="UBM - A/A" MaxSteps="50"

 />

4 个答案:

答案 0 :(得分:1)

使用XMLStarlet

xmlstarlet sel -t -m '//TxnDetail[@BillPlan="UBM - A/A"]' \
                  -v ./@ObjDevice -n \
  <in.xml

答案 1 :(得分:1)

使用我的Xidel,您可以:

xidel /tmp/foo.xml -e '//TxnDetail[@BillPlan="UBM - A/A"]/@ObjDevice'

答案 2 :(得分:1)

如果你没有一个特殊的工具来处理XML文件,并且你总是在同一行中有两个值,那么你可以执行:

grep 'BillPlan="UBM - A/A"' | sed 's,.*ObjDevice="\([0-9]*\)" BillPlan="UBM - A/A".*,\1,"

很抱歉,如果我不使用sed过滤但不熟悉sed而且也无法访问* nix,但也许其他人可以给我们短版

答案 3 :(得分:1)

我安装了libxml2(非常可能在任何GNU / Linux系统上):

xmllint --xpath '//TxnDetail[@BillPlan="UBM - A/A"]/@ObjDevice' input.xml