XML Starlet修改复杂XML的命令

时间:2013-06-11 18:00:27

标签: xml xml-parsing xmlstarlet

我有一个包含用户身份信息的XML文件。我想自动修改和删除用户,到目前为止成功使用XmlStarlet删除。现在我不知道如何通过用户名搜索来修改用户信息。任何人都可以帮助我使用命令如何使用xmlstarlet

进行修改
    <table name="MANAGED_USER" keys="CONTEXT_ID,USERNAME">
     <row>
     <column name="USERNAME">IAM_User7</column>
     <column name="CONTEXT_ID">PROVCLIENT</column>
     <column name="ALGORITHM">DESEDE</column>
     <column name="PASSWORD">2e02f952e8743b36</column>
     <column name="FAILED_LOGINS">0</column>
     <column name="REALNAME">IAM User 7</column>
     <column name="VALIDFROM">2013-06-03 00:00:00.0</column>
     <column name="VALIDUNTIL">2014-06-01 00:00:00.0</column>
     <column name="USER_TYPE">1</column>
     <column name="LOCKED">0</column>
     <column name="CHANGED_BY">tam</column>
     <column name="ORGANISATION_NAME" is_null="true">null</column>
    </row>
    </table>

提前致谢

1 个答案:

答案 0 :(得分:2)

这样的东西? (使用用户名“IAM_User7”锁定用户)

xmlstarlet ed -u '/table/row[column[@name = "USERNAME"] = "IAM_User7"]/column[@name = "LOCKED"]' -v 1 table.xml

假设table.xml包含问题中的内容。


不幸的是,添加新用户非常繁琐,这只是前两个字段:

xmlstarlet ed -s /table -t elem -n row -v '' \
    --var new '$prev' \
    -s '$new' -t elem -n column -v IAM_User8 \
    -s '$prev' -t attr -n name -v USERNAME \
    -s '$new' -t elem -n column -v PROVCLIENT \
    -s '$prev' -t attr -n name -v CONTEXT_ID \
    table.xml

需要1.4.0或更高版本(适用于--var$prev;可以使用带有丑陋技巧的早期版本。)