xmlstarlet 无法加载外部实体

Ste*_*ell 5 xml xmlstarlet

我的脚本是一个简单的单行脚本,它使用 curl 获取带有 xml 输出的 URL。我正在尝试仅输出以下标签中的文本:

<TEXT>No Hosts Queued for Purging</TEXT>
Run Code Online (Sandbox Code Playgroud)

我的脚本:

curl -u username:password -H 'X-Requested-With:QualysApiExplorer' 'https://qualysapi.qualys.com:443/api/2.0/fo/asset/host/' -d "action=purge&ips=$1&" | xmlstarlet sel -t -m '/BATCH_RETURN/RESPONSE/BATCH_LIST/BATCH/TEXT' -v "."
Run Code Online (Sandbox Code Playgroud)

不使用 xmlstarlet 时的 curl 输出如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE BATCH_RETURN SYSTEM "https://qualysapi.qualys.com/api/2.0/batch_return.dtd">
<BATCH_RETURN>
  <RESPONSE>
    <DATETIME>2017-04-20T20:27:15Z</DATETIME>
    <BATCH_LIST>
      <BATCH>
        <CODE>1921</CODE>
        <TEXT>No Hosts Queued for Purging</TEXT>
      </BATCH>
    </BATCH_LIST>
  </RESPONSE>
</BATCH_RETURN>
Run Code Online (Sandbox Code Playgroud)

使用 xmlstarlet 时出现以下错误:

failed to load external entity "https://qualysapi.qualys.com/api/2.0/batch_return.dtd"
TYPE BATCH_RETURN SYSTEM "https://qualysapi.qualys.com/api/2.0/batch_return.dtd"
                                                                               ^
Run Code Online (Sandbox Code Playgroud)

Ber*_*tel 6

您可以fo -D在执行查询之前删除文档类型 ( sel) :

xml fo --help
XMLStarlet Toolkit: Format XML document
Usage: xml fo [<options>] <xml-file>
where <options> are
   -D or --dropdtd             - remove the DOCTYPE of the input docs
Run Code Online (Sandbox Code Playgroud)

以下内容可行:

curl -u username:password \
     -H 'X-Requested-With:QualysApiExplorer' \
     'https://qualysapi.qualys.com:443/api/2.0/fo/asset/host/' \
     -d "action=purge&ips=$1&" | \
     xmlstarlet fo -D | \
     xmlstarlet sel -t -v "BATCH_RETURN/RESPONSE/BATCH_LIST/BATCH/TEXT"
Run Code Online (Sandbox Code Playgroud)