在bash中使用XPath输出多个文件

时间:2013-08-10 22:21:35

标签: xml bash shell xpath batch-processing

我有一个XML文件目录。每个文件都有自己的唯一标识符。每个文件还包含一个或多个对其他文件的引用(在单独的目录中),它们也具有唯一的ID。

例如,我有一个名为example01.xml的文件:

<file>
    <fileId>xyz123</fileId>
    <fileContents>Blah blah Blah</fileContents>
    <relatedFiles>
        <otherFile href='http://sub.domain.abc.edu/directory/index.php?p=collections/pageview&amp;id=123‌​4'>
            <title>Some resource</title>
        </otherFile>
        <otherFile href='http://sub.domain.abc.edu/directory/index.php?p=collections/pageview&amp;id=4321'>
            <title>Some other resource</title>
        </otherFile>
    </relatedFiles>
</file>

如果一个文件有多个relatedFiles/otherFile个元素,我需要为每个@href创建一个文件副本并重命名,并将@href中唯一ID的值与值fileID。因此,例如,我需要创建文件example01.xml的两个副本,一个名为abc01_xyz123.xml,另一个名为abc0002_xyz123.xml。这应该扩展为创建与otherFile元素一样多的副本。

现在,我有一个bash脚本可以执行此操作,如果只有一个otherFile元素,但我的脚本技能有限,我无法确定如何处理多个otherFile元素

#!/bin/bash
for f in *.xml; 
    do 
        name=`xpath -e 'string(//otherFile/@href)' $f 2> /dev/null`
        echo  "Moving" $f "to" ${name:3}.xml
        echo $name
        mv $f ${name:3}.xml
    done

提前致谢。

1 个答案:

答案 0 :(得分:1)

这样的事可能有用:

#!/bin/bash

for f in *.xml; do
  fid=$(xpath -e '//fileId/text()' "$f" 2>/dev/null)
  for uid in $(xpath -e '//otherFile/@href' "$f" 2>/dev/null | awk -F= '{gsub(/"/,"",$0); print $3}'); do
    echo  "Moving $f to ${fid}_${uid}.xml"
    cp "$f" "${fid}_${uid}.xml"
  done
  rm "$f"
done