【问题标题】:Read from xml to bash [duplicate]从xml读取到bash [重复]
【发布时间】:2013-11-27 16:36:45
【问题描述】:

这里是 shell 脚本的新手。例如,我如何读取以下 xml 代码中的每个名称并将所有名称放在列中?

<rates>
   <currency>
      <name>Australian dollar</name>
      <rate>2.34</rate>
      <amount>1</amount>
   </currency>
   <currency>
      <name>GB Pounds</name>
      <rate>4.12</rate>
      <amount>1</amount>
   </currency>
   <currency>
      <name>Euro</name>
      <rate>3.45</rate>
      <amount>1</amount>
   </currency>
   <currency>
      <name>USA dollar</name>
      <rate>2.55</rate>
      <amount>1</amount>
   </currency>
   <currency>
      <name>Russian ruble</name>
      <rate>7.72</rate>
     <amount>100</amount>
   </currency>

【问题讨论】:

标签: xml bash shell


【解决方案1】:

正如有人指出的那样,“sed”是一种从 XML 文件中提取给定元素的好方法——只要您的实际 XML 与 OP 给出的示例一样简单。但请注意以下情况:

  • 不完整且单独在一行中的元素
  • 可以嵌套的元素,例如 HTML 列表或 div 或 span ....
  • 看起来像标签但不是标签的数据——因为它被转义了,例如在 CDATA 标记的部分、处理指令或 cmets 中。

您有时可以通过首先重新换行杂乱数据来处理这种情况,例如,您要匹配的开始标签始终位于行首。

如果你想获取多个元素,覆盖更一般的情况等等,这将需要更多的工作。许多方法之一是转换为像 CSV 这样简单的东西(我有 Perl 脚本,称为 'xml2tab' 和 'tab2xml' 我一直用于此)。

【讨论】:

    【解决方案2】:

    如果你只想从 xml 文件中提取特定的标签值,你可以使用 sed。

     sed  -n 's/.*<name>\(.*\)<\/name>/\1/p' test.txt
    
     #extract and print comma separated list
     sed  -n 's/.*<name>\(.*\)<\/name>/\1/p' t1.txt | tr '\n' ','
    

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2016-04-19
      • 2016-02-02
      • 1970-01-01
      相关资源
      最近更新 更多