【问题标题】:Struggling with xmlstarlet与 xmlstarlet 苦苦挣扎
【发布时间】:2013-01-25 18:08:35
【问题描述】:

我有一个非常简单的 XML 文件,需要用 xmlstarlet 解析(我在 Windows 下):

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <pain.001.001.02>
    <GrpHdr>
      <MsgId>IDENTIFYER</MsgId>
      <CreDtTm>2013-01-25T11:15:02</CreDtTm>
      <NbOfTxs>6</NbOfTxs>
      <CtrlSum>6268.07</CtrlSum>
      <Grpg>MIXD</Grpg>
    </GrpHdr>
   <PmtInf>
   </PmtInf>
  </pain.001.001.02>
</Document>

假设我想检索 CtrlSum 元素;当我尝试时它失败了

xml sel -t -m "/Document/pain.001.001.02/GrpHdr" -v CtrlSum myfile.xml

但是,如果我从文件中删除 xmlns 和 xmlns:xsi 属性,它就可以工作(但在现实生活中我不能这样做)。 我知道我必须使用 -N 选项,但我不知道该怎么做。 任何帮助都会非常有价值。

非常感谢 Laurent(或 Lawrence,或 Larry :))

【问题讨论】:

    标签: xml xmlstarlet


    【解决方案1】:

    xmlns 属性定义了默认命名空间,您在 XML 文件中看到的每个没有前缀的元素(恰好是您发布的示例中的所有元素)都使用默认命名空间。 XPath 不允许默认命名空间,因此您必须使用 -N 为其分配前缀并在匹配时使用它:

    xml sel -N p=urn:iso:std:iso:20022:tech:xsd:pain.001.001.02 -t -v /p:Document/p:pain.001.001.02/p:GrpHdr/p:CtrlSum myfile.xml
    

    【讨论】:

      【解决方案2】:

      从 1.2.1 版本开始,您可以使用默认命名空间 _
      (删除-N 参数)

      xml sel -t -m "/_:Document/_:pain.001.001.02/_:GrpHdr" -v CtrlSum myfile.xml
      

      正如here解释的那样:

      1.3。更方便的解决方案

      XML 文档也可以使用不同的命名空间前缀,在任何 文档中的元素。为了处理更大的命名空间 轻松,XMLStarlet(1.2.1+ 版本)将使用命名空间前缀 在输入文档的根元素上声明。默认 命名空间将绑定到前缀“_”和“DEFAULT”(在版本中 1.5.0+)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-04
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多