【问题标题】:xmllint not returning what I expect -- n00b warning [duplicate]xmllint 没有返回我所期望的——n00b 警告 [重复]
【发布时间】:2020-12-24 00:55:28
【问题描述】:

问题> 我有一些从 API 调用返回的 xml,存储在 get_build_info.xml 中。我正在尝试从该 xml 中获取一个属性 build_id。这是xml:

 <?xml version="1.0" encoding="UTF-8"?>

<buildinfo xmlns:xsi="http&#x3a;&#x2f;&#x2f;www.w3.org&#x2f;2001&#x2f;XMLSchema-instance" xmlns="https&#x3a;&#x2f;&#x2f;analysiscenter.veracode.com&#x2f;schema&#x2f;4.0&#x2f;buildinfo" xsi:schemaLocation="https&#x3a;&#x2f;&#x2f;analysiscenter.veracode.com&#x2f;schema&#x2f;4.0&#x2f;buildinfo https&#x3a;&#x2f;&#x2f;analysiscenter.veracode.com&#x2f;resource&#x2f;4.0&#x2f;buildinfo.xsd" buildinfo_version="1.4" account_id="1234" app_id="010101" sandbox_id="020202" build_id="987654321"><build version="4 Sep 2020 Static &#x28;2&#x29;" build_id="987654321" submitter="Someone Else" platform="Not Specified" lifecycle_stage="Not Specified" results_ready="true" policy_name="Some Development App Policy" policy_version="7" policy_compliance_status="Conditional Pass" rules_status="Not Assessed" grace_period_expired="false" scan_overdue="false" legacy_scan_engine="false">
      <analysis_unit analysis_type="Static" published_date="2020-09-04T11&#x3a;44&#x3a;09-04&#x3a;00" published_date_sec="1599234249" status="Results Ready" engine_version="20200821190810"/>
   </build>
</buildinfo>

我尝试过的> 以下及其许多其他变体:

xmllint --xpath 'string(//xml/buildinfo/@build_id)' get_build_info.xml

xmllint --xpath 'string(//buildinfo/@build_id)' get_build_info.xml

xmllint --xpath 'string(/xml/buildinfo/@build_id)' get_build_info.xml

xmllint --xpath '(//xml/buildinfo/build_id/text())' get_build_info.xml

xmllint --xpath '(/xml/buildinfo/build_id/text())' get_build_info.xml

最后两个至少产生某种输出,尽管“XPath 集为空”。我在 --xpath 中使用那个 'string( +...+ @build_id 的前几个,我什么也没返回。这些似乎也从 bash 退出 0,所以我能做到的没有语法问题告诉。就像我说的,我是 n00b。我在 stackoverflow 上查看了其他流行的票证,这就是让我走到这一步的原因。我很可能不会在这里考虑一些明显的事情,所以假设我对 bash 一无所知(这几乎是真的)。​​我很高兴得到指示,让我自己去寻找答案。

【问题讨论】:

  • 这是关于命名空间的,这是一个有用的解决方案:stackoverflow.com/questions/8264134/…
  • 谢谢!我现在正在检查链接,似乎正是我的问题以及我需要阅读的内容。
  • 如果您对替代方案感兴趣,例如 xidel,您可以这样做:xidel -s get_build_info.xml -e '//@build_id'
  • 也会检查一下。谢谢

标签: xml bash xpath xmllint


【解决方案1】:

你正被命名空间纠缠,所以尝试使用如下的 xpath 表达式:

//*[local-name()='buildinfo']/@build_id

看看它是否有效。

【讨论】:

  • !!这返回了我需要的值和一点额外的 -build_id="987654321" 。这是了不起的进步。我假设也有一些不错的方法可以从中提取实际价值。将对此进行调查,感谢任何建议!
  • @new2tech 它不应该那样做——但试着把string() 放在整个事情上。另外 - 更一般地说,考虑使用类似 xmlstarlet 的东西,或者 - 更高级的 - xidel。
  • string() 围绕整个 --xpath 表达式?我尝试了几个不同的选项,但我认为我在 xpath 中没有找到正确的位置:xmllint --xpath string("//*[local-name()='buildinfo']/@build_id")xmllint --xpath "string(//*[local-name()='buildinfo']/@build_id)" 由于可以安装依赖项的限制,xmllint 可能是这种情况的唯一工具,但我会研究其他建议。谢谢你!
  • 哦等等 - 我明白了!它是xmllint --xpath "string(//*[local-name()='buildinfo']/@build_id)" get_build_info.xml 这看起来与我在上面的评论中列出的完全相同的命令(#2)..不确定我做错了什么,但它在那里并分配给了一个变量!谢谢!
  • 当我用标签完成 get_build_info.xml 时,出现了一些奇怪的语法错误。那是我的问题。
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 2021-12-11
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
相关资源
最近更新 更多