如何使用 xmllint 或 xmlstarlet 解析 SOAP 文件?

发布于 2025-01-10 01:32:59 字数 703 浏览 0 评论 0 原文

我有以下 SOAP 文件:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
    <auth:Session xmlns:auth="http://www" SOAP-ENV:mustUnderstand="1">
      <auth:IPAddress>1111</auth:IPAddress>
    </auth:Session>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <auth:SessionT xmlns:auth="http://www.">result</auth:SessionT>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

并且我想获得结果。 我尝试了不同的方法,但每次都会遇到相同的错误 “SessionT 上的命名空间前缀身份验证未定义”

这是我尝试过的命令之一: xmlstarlet sel -t -v /auth:SessionT test.xml

Br, 京东

I have the following SOAP file:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
    <auth:Session xmlns:auth="http://www" SOAP-ENV:mustUnderstand="1">
      <auth:IPAddress>1111</auth:IPAddress>
    </auth:Session>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <auth:SessionT xmlns:auth="http://www.">result</auth:SessionT>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

and I want to get result.
I have tried different ways but every time I get the same error
"Namespace prefix auth on SessionT is not defined".

Here it is one of the commands I've tried:
xmlstarlet sel -t -v /auth:SessionT test.xml

Br,
JD

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乱世争霸 2025-01-17 01:32:59

使用 xmlstarlet,使用 -N 选项提供源文档中存在的命名空间:

$ xmlstarlet sel -N auth="http://www." -t -v "//auth:SessionT" test.xml
result

使用 xmllint,您可以简单地使用 local -name() 仅检查标签名称:

$ xmllint --xpath '//*[local-name() = "SessionT"]/text()' test.xml
result

未标记,但另一种替代方法是使用 xq (由 jq 包装器) “https://github.com/kislyuk/yq” rel="nofollow noreferrer">yq) 像这样:

$ xq -r '.. | ."auth:SessionT"? // empty | ."#text"' test.xml
result

With xmlstarlet, provide the namespace present in the source document using the -N option:

$ xmlstarlet sel -N auth="http://www." -t -v "//auth:SessionT" test.xml
result

Using xmllint, you could instead simply use local-name() to just check the tag name:

$ xmllint --xpath '//*[local-name() = "SessionT"]/text()' test.xml
result

Not tagged, but yet another alternative would be using xq (a jq wrapper provided with yq) like this:

$ xq -r '.. | ."auth:SessionT"? // empty | ."#text"' test.xml
result
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文