如何使用 xmlstarlet 验证 xml 标签?

How to validate xml tags using xmlstarlet?

我有一个 xml 文件:config.xml,其中包含以下标签:

 <roleMap type="globalRoles">
  <role name="ABC Employee" pattern=".*">
     <assignedSIDs>
      <sid>abc</sid>
      <sid>cde</sid>
      <sid>efg</sid>
    </assignedSIDs>
  </role>
 </roleMap>

<roleMap type="projectRoles">
   <role name="Proj1" pattern="Proj1.*">
    <permissions/>
    <assignedSIDs>
      <sid>abc</sid>
      <sid>jkl</sid>
     </assignedSIDs>
  </role>

  <role name="Proj2" pattern="Proj2.*">
    <permissions/>
    <assignedSIDs>
      <sid>hij</sid>
      <sid>cde</sid>          
    </assignedSIDs>
  </role>


  <role name="Proj3" pattern="Proj3.*">
    <permissions/>
     <assignedSIDs>
      <sid>zxc</sid>
      <sid>efg</sid>
    </assignedSIDs>
  </role>
</roleMap>

它包含两个roleMap标签类型:globalRoles和projectRoles。

到目前为止,我已经能够使用以下 shell 脚本在 globalRoles 和 projectRoles 中添加用户:

read -p 'Enter UserName and projectName  :' user projectName
echo -e "user name :$user       project name :$projectName"

xmlstarlet ed -P -S -s "/hudson/authorizationStrategy/roleMap
[@type='globalRoles']/role[@name='ABC Employee']/assignedSIDs"
 -t elem -n sid -v $user -s "/hudson/authorizationStrategy/roleMap
 [@type='projectRoles']/role[@name='$projectName']/assignedSIDs" -t elem 
 -n sid -v $user  config.xml >me1.xml

mv config.xml config_old.xml
mv me1.xml config.xml

我需要的是在脚本中包含一些条件,这对我有帮助:
1)验证xml文件(所有标签是否关闭。)
2) 查找 $user 是否已经存在于全局角色中。 (如果用户已经存在于全局角色中,脚本不应添加用户并发出警告“用户已经存在于全局角色中”)。
3)Find whether user is already present in projectRoles of specific project.(如果用户存在于特定项目中,脚本必须给出警告“用户已经存在于特定项目中”)。

我不确定哪个命令可用于验证 xml 文件中的标签。 (我正在考虑使用 grep 命令或 awk )。

首先感谢大家的意见。 首先,我使用以下命令验证了 xml 文件:

xml小明星 val -w config.xml

然后,我在 if..else..fi 条件循环中使用 grep 命令来验证 xml 文件中存在的用户。

if(echo $user | grep -o -q "$user" config.xml).... then... else... fi.