【问题标题】:Bash script for getting tag value用于获取标签值的 Bash 脚本
【发布时间】:2018-07-03 18:02:25
【问题描述】:

如果我只有在 xml 文件中描述的标签(“answer_yes”或“answer_no”),是否有任何方法可以获得价值(是或否)。我想使用 bash 来获取它们。

<string tag="answer_yes" value="Yes"/>
<string tag="answer_no" value="No"/>

【问题讨论】:

  • 顺便说一句——我假设有一个更大的 XML 文件是从中获取的?这两行不是给定的有效文档,因为它们不在一个根目录下。

标签: xml bash shell


【解决方案1】:

sed 中,如果您的 Input_file 与显示的示例相同,那么以下内容可能对您有所帮助。

sed 's/.*answer_//;s/".*//'  Input_file

【讨论】:

    【解决方案2】:

    使用可识别 XML 的工具。对于这个简单的查询,xmllint 就足够了:

    answer=answer_yes
    xmllint --xpath "//string[@tag='$answer']/@value" file.xml | cut -f2 -d\"
    

    不过,它似乎不会扩展实体,因此如果您的真实字符串包含引号,则必须将 &amp;quot;&amp;amp;&amp;lt; 替换为 "&amp;&lt; @,分别。

    xsh 为您处理实体:

    xsh -aC 'open file.xml; $answer={$ARGV[0]};
             echo //string[@tag=$answer]/@value' "$answer"
    

    【讨论】:

      【解决方案3】:
      regex='tag="answer_yes"[[:space:]]+value="([^"]+)"'
      
      if [[ '<string tag="answer_yes" value="Yes"/>' =~ $regex ]] ; then
          echo "${BASH_REMATCH[1]}" ;
      fi
      

      随意扩展正则表达式以获得更准确的匹配。

      来源:

      【讨论】:

      • 请不要链接 TLDP 的文档——我们在 Freenode #bash 频道中所做的一半是帮助人们忘记他们在那里学到的不良做法。
      • (更大的反对意见是正则表达式无法理解 XML 语法——如果它在评论中,它不会忽略你的 string;它不会理解 @ 里面的东西987654326@ 部分是文字;它不理解 xmlns="http://example.com/" 声明会产生 {example.com}string 而不是 string 等)。
      • (...返回文档 -- Wooledge BashGuide 已编写并得到积极维护,以成为更准确和更注重最佳实践的替代方案)。
      • 哦,我没有意识到。感谢您为我提供更好的 bash 指南!
      【解决方案4】:

      要在 XML 文档中提取带有 tag="answer_yes"tag="answer_no" 的所有字符串的 value 元素,XMLStarlet 是一个合适的工具:

      xmlstarlet sel -t -m '//string[@tag="answer_yes" or @tag="answer_no"]' -v '@value' -n
      

      这将在天真的基于正则表达式的方法不起作用的情况下工作:它将识别 cmets 和 CDATA 并避免尝试解析它们;它将忽略不在stringtag 内的answer_ 内容;它将识别通过您的 DTD 引入的别名;它将在输出中正确地将&amp;amp; 更改为&amp;tagvalue 是否在元素中首先给出是不可知的;它不关心分隔元素与其属性的空格是否是制表符/空格/换行符/等;等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 2013-01-05
        • 2020-04-01
        • 1970-01-01
        • 2017-01-29
        • 2017-12-26
        相关资源
        最近更新 更多