Xml文件处理-xmlstarlet属性划分(用于图片标注)

Xml file handling - xmlstarlet attribute division (for image annotation)

我有一个 XML 文件(如下所示)

<annotation>
<folder>Definitiva</folder>
<filename>armas (1)</filename>
<path>C:\Users\Rob\Desktop\Definitiva\armas (1).jpg</path>
<source>
  <database>Unknown</database>
</source>
<size>
  <width>240</width>
  <height>145</height>
  <depth>3</depth>
</size>
<segmented>0</segmented>
<object>
  <name>pistol</name>
  <pose>Unspecified</pose>
  <truncated>0</truncated>
  <difficult>0</difficult>
  <bndbox>
    <xmin>3</xmin>
    <ymin>1</ymin>
    <xmax>128</xmax>
    <ymax>100</ymax>
  </bndbox>
</object>

并且我想让边界框坐标从相对坐标变为绝对坐标。换句话说,我需要通过将其当前值 (=3) 除以图像的宽度 (=240) 来更新 xmin 值。我正在使用 xmlstarlet 和 bash(我做了其他更简单的修改并且运行良好)但是我编写的脚本产生了一个错误(实际上,它完全删除了 xmin 属性)。你知道出了什么问题吗?

for name in *.xml; do X='/annotation/object/bndbox/xmin' 
Y='/annotation/size/width' Z=$X/$Y xmlstarlet ed --inplace -u 
'/annotation/object/bndbox/xmin' -v "$Z" "$name"; done

谢谢。

xmlstarlet解法:

xmlstarlet ed -u '/annotation/object/bndbox/xmin' -x '. div /annotation/size/width' input.xml

输出(用于演示目的):

<?xml version="1.0"?>
<annotation>
  <folder>Definitiva</folder>
  <filename>armas (1)</filename>
  <path>C:\Users\Rob\Desktop\Definitiva\armas (1).jpg</path>
  <source>
    <database>Unknown</database>
  </source>
  <size>
    <width>240</width>
    <height>145</height>
    <depth>3</depth>
  </size>
  <segmented>0</segmented>
  <object>
    <name>pistol</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>0.0125</xmin>
      <ymin>1</ymin>
      <xmax>128</xmax>
      <ymax>100</ymax>
    </bndbox>
  </object>
</annotation>

  • div - Xpath算术除法运算符(<operand_1> div <operand_2>)