2

我有一个非常简单的 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 :))

4

2 回答 2

5

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
于 2013-01-26T02:33:37.303 回答
0

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

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

如此处所述:

1.3. 更方便的解决方案

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

于 2017-06-28T18:12:01.073 回答