Parsing xml to and replacing specific tags shell script

前端 未结 3 1038
抹茶落季
抹茶落季 2021-02-10 02:40

For the below xml ,I need to replace for CLASSA to failed

相关标签:
3条回答
  • 2021-02-10 03:07

    Update value with xmllint in file.xml:

    xmllint --shell file.xml << EOF
    cd /studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus
    set failed
    save
    EOF
    

    or without here document:

    echo -e "cd /studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus\nset failed\nsave" | xmllint --shell file.xml
    

    Update: With bash and XML in a variable:

    xml=$(xmllint --shell <(echo "$xml") << EOF
    cd /studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus
    set failed
    save -
    EOF
    )
    

    or without here document:

    xml=$(echo -e "cd /studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus\nset failed\nsave -" | xmllint --shell <(echo "$xml"))
    
    0 讨论(0)
  • 2021-02-10 03:28

    xlmlint, as the name implies, is for parsing and validating XML, not editing it. If you can install xmlstarlet on your cluster, you can do the following:

    xmlstarlet ed --update "/studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus" --value "Failed" *file*
    
    0 讨论(0)
  • 2021-02-10 03:30

    In case if xmlstarlet (a command line toolkit to query/edit/check/transform XML documents) is accessible:

    xmlstarlet ed -u "//studentAction/studentStatus[preceding-sibling::studentType[1][text() = 'Juniour'] \
               and ancestor::student/studentName[text() = 'CLASSA']]" -v failed students.xml
    

    The above will output the initial XML document with needed replacement


    The command details:

    ed -u - edit/update mode

    //studentAction/studentStatus - xpath expression to select studentStatus element which has:

    • preceding-sibling::studentType[1][text() = 'Juniour'] - preceding sibling element studentType with value Juniour
    • ancestor::student/studentName[text() = 'CLASSA'] - nearest element studentName with value CLASSA
    0 讨论(0)
提交回复
热议问题