【问题标题】:Linux xml parseLinux xml解析
【发布时间】:2019-04-29 10:41:06
【问题描述】:

我正在尝试使用 xmllint 解析 xml 文件的一部分,但我无法让它工作。

这是我感兴趣的部分:

    <?xml version="1.0" encoding="UTF-8"?>
<S2SCTIcf:SCTIcfBlkCredTrf xmlns:S2SCTIcf="urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf SCTIcfBlkCredTrf.xsd">
  <S2SCTIcf:SndgInst>AAAAAAAA</S2SCTIcf:SndgInst>
  <S2SCTIcf:RcvgInst>BBBBBBBB</S2SCTIcf:RcvgInst>
  <S2SCTIcf:FileRef>ISCT181127000006</S2SCTIcf:FileRef>
  <S2SCTIcf:SrvcId>SCT</S2SCTIcf:SrvcId>
  <S2SCTIcf:TstCode>T</S2SCTIcf:TstCode>
  <S2SCTIcf:FType>ICF</S2SCTIcf:FType>
  <S2SCTIcf:FDtTm>2018-11-27T17:01:41.198+00:00</S2SCTIcf:FDtTm>
  <S2SCTIcf:NumCTBlk>1</S2SCTIcf:NumCTBlk>
  <S2SCTIcf:NumPCRBlk>0</S2SCTIcf:NumPCRBlk>
  <S2SCTIcf:NumRFRBlk>0</S2SCTIcf:NumRFRBlk>
  <S2SCTIcf:NumROIBlk>0</S2SCTIcf:NumROIBlk>
  <S2SCTIcf:NumSRBlk>0</S2SCTIcf:NumSRBlk>
  <S2SCTIcf:FIToFICstmrCdtTrf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02">

例如,有没有办法从标签&lt;S2SCTIcf:FDtTm&gt; 中获取值?我应该避开: 符号吗?

【问题讨论】:

  • 我看到了一个 XML sn-p,但没有看到您尝试的内容或失败的方式?就目前而言,这是题外话......
  • 我试过命令xmllint --shell file.xml &lt;&lt;&lt; "cat //S2SCTIcf:FDtTm/text()" XPath error : Undefined namespace prefix xmlXPathEval: evaluation failed //S2SCTIcf:FDtTm/text(): no such node

标签: xml linux xml-parsing xmllint


【解决方案1】:

冒号前面的东西是命名空间前缀。您需要注册命名空间并在 XPath 表达式中使用它:

setns s=urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf
cat //s:FDtTm/text()

所以,整个脚本可以是这样的

#!/bin/bash

ext=$(cat <<'EOF'                    \
          | xmllint --shell file.xml \
          | grep -A1 -- '-------'    \
          | tail -n1
setns s=urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf
cat //s:FileRef/text()
EOF
)
echo "$ext"

【讨论】:

  • 您好,感谢您的解决方案。有没有办法将以下命令的输出存储到 bash 变量中? xmllint --shell filename | awk 'FNR==2 { print $0 }' | cut -c 1-1。我正在尝试这样#!/usr/bin/bash #set -x echo 'setns s=urn:S2SCTCvf:xsd:$SCTCvfBlkCredTrf cat //s:FileRef/text()' | \ ext=$(xmllint --shell filename | awk 'FNR==2 { print $0 }' | cut -c 1-1) echo $ext,但它似乎不起作用。
  • 为什么您的解决方案不起作用:管道中的命令在子 shell 中执行。变量值的更改不会从子 shell 传播到父 shell。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2012-02-12
  • 2016-11-09
  • 2012-03-06
  • 2010-09-10
  • 2011-06-25
  • 2010-12-25
相关资源
最近更新 更多