【问题标题】:How do I update <path> in my XML according to the given file name如何根据给定的文件名更新 XML 中的 <path>
【发布时间】:2018-09-04 11:58:58
【问题描述】:
<annotation>
  <folder>cars_train</folder>
  <filename>00001.jpg</filename>
  <path>Users/hantaoliu/Documents/Research/cars_train/.jpg</path>
  <source>
    <database>Unknown</database>
  </source>
  <size>

上面的文本是我要更新的 XML 文件之一。我有 7k XML 文件,我希望它们的路径是:

Users/hantaoliu/Documents/Research/cars_train/$@.jpg

$@ 对应输入文件的名称。例如,如果输入文件是00001.xml,我希望路径是:

Users/hantaoliu/Documents/Research/cars_train/00001.jpg

我正在使用xmlstarlet,但我无法弄清楚?

【问题讨论】:

    标签: xml linux xmlstarlet


    【解决方案1】:

    你可以像这样完成你想要的。先选择filename的值和path的值。

    $ filenameVal=$(xmlstarlet sel -t -v "/annotation/filename" file)
    $ pathVal=$(xmlstarlet sel -t -v "/annotation/path" file)
    

    接下来通过$(dirname $pathVal) 确定path 的目录名称并将$filenameVal 连接到它。您可以在不编辑文件的情况下对此进行测试运行:

    $ xmlstarlet ed -u "/annotation/path" -v "$(dirname $pathVal)/$filenameVal" file
    <?xml version="1.0"?>
    <annotation>
      <folder>cars_train</folder>
      <filename>00001.jpg</filename>
      <path>Users/hantaoliu/Documents/Research/cars_train/00001.jpg</path>
      <source>
        <database>Unknown</database>
      </source>
      <size>
      </size>
    </annotation>
    

    如果看起来不错,您可以添加 -L 开关,告诉 xmlstartlet 进行就地编辑。

    $ xmlstarlet ed -L -u "/annotation/path" -v "$(dirname $pathVal)/$filenameVal" file
    

    确认file中的结果:

    $ cat file
    <?xml version="1.0"?>
    <annotation>
      <folder>cars_train</folder>
      <filename>00001.jpg</filename>
      <path>Users/hantaoliu/Documents/Research/cars_train/00001.jpg</path>
      <source>
        <database>Unknown</database>
      </source>
      <size>
      </size>
    </annotation>
    

    参考文献

    【讨论】:

    • 我必须在文件中输入每个单独的文件名吗?
    • 比如这一步$ filenameVal=$(xmlstarlet sel -t -v "/annotation/filename" file),如果我在做00002,是不是一定要改filenameVal中file的值.xml?
    • @LiuHantao - 我不确定你对 7K 文件的结构。您可以使用 find 或 Bash for 循环来处理它们并执行上述操作。
    • @LiuHantao - 没错,上面是该方法的模板。您需要遍历所有文件才能完成此操作。
    • 如何在 xmlstarlet 中使用循环?一个shell脚本?
    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多