首页 > 解决方案 > 从具有相似块的 XML 文件中提取数据

问题描述

来源

<?xml version="1.0"?>
 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
      <lima2t:runlargeResponse xmlns:lima2t="uri://Metadata.com/home/1.0">
        <data>
          <capacity>
              <name>Everyday.Italian.Dish</name>
              <currency>($)</currency>
              <CashAmount>not.used.for.this.transaction</CashAmount>
              <CheckAmount>not.used.for.this.transaction</CheckAmount>
              <CreditAmount>not.used.for.this.transaction</CreditAmount>
          </capacity>
          <capacity>
              <name>Everyday.French.Dish</name>
              <currency>($)</currency>
              <CashAmount>not.used.for.this.transaction</CashAmount>
              <CheckAmount>not.used.for.this.transaction</CheckAmount>
              <CreditAmount>134,70</CreditAmount>
          </capacity>
      </data>
    </lima2t:runlargeResponse>
  </soap:Body>
</soap:Envelope>

目标提取:

134,70<CreditAmount>134,70</CreditAmount>

我试过这个命令,但命令会在屏幕上输出所有内容

xmllint --path '//soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/soap:Body/lima2t:runlargeResponse xmlns:lima2t="uri://Metadata.com/home/1.0"/data/capacity/@name="Everyday.French.Dish"/CreditAmount/text()' op.xml

我感觉好像少了点什么但我找不到什么

标签: xmllinuxsoapxmlstarletxmllint

解决方案


像这样:

xmllint --xpath '
    //data/capacity[name="Everyday.French.Dish"]/CreditAmount/text()
' op.xml

或者使用 shell 开关(需要额外的后处理来去除垃圾):

xmllint --shell op.xml<<EOF
cat //data/capacity[name="Everyday.French.Dish"]/CreditAmount/text()
EOF

或使用

xmlstarlet sel -t -v '
    //data/capacity[name="Everyday.French.Dish"]/CreditAmount/text()
' op.xml

输出:

134,70

推荐阅读