For the below xml ,I need to replace <studentStatus>
for <studentName>CLASSA</studentName>
to <studentStatus>failed</studentStatus>
.
<studentFile>
<student>
<studentName>CLASSA</studentName>
<studentStatus>Success</studentStatus>
<studentActions>
<studentAction>
<studentType>Juniour</studentType>
<studentStatus>Completed</studentStatus>
<studentMsg/>
</studentAction>
<studentAction>
<studentType>HighSchool</studentType>
<studentStatus>Completed</studentStatus>
<studentMsg/>
</studentAction>
</studentActions>
</student>
<student>
<studentName>CLASSB</studentName>
<studentStatus>Success</studentStatus>
<studentActions>
<studentAction>
<studentType>Senior</studentType>
<studentStatus>Completed</studentStatus>
</studentAction>
<studentAction>
<studentType>Middle</studentType>
<studentStatus>Completed</studentStatus>
</studentAction>
</studentActions>
</student>
</studentFile>
What I got so far,
xmllint -xpath "/studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType="Juniour"]/studentStatus" myxml.xml
now i got the status of the student as Completed , now this value should be changed to Failed . Only for <studentType>Juniour</studentType>
.
How should I edit the xml inorder to get it as ,
<studentFile>
<student>
<studentName>CLASSA</studentName>
<studentStatus>Success</studentStatus>
<studentActions>
<studentAction>
<studentType>Juniour</studentType>
<studentStatus>Failed</studentStatus>
<studentMsg/>
</studentAction>
<studentAction>
<studentType>HighSchool</studentType>
<studentStatus>Completed</studentStatus>
<studentMsg/>
</studentAction>
</studentActions>
</student>
<student>
<studentName>CLASSB</studentName>
<studentStatus>Success</studentStatus>
<studentActions>
<studentAction>
<studentType>Senior</studentType>
<studentStatus>Completed</studentStatus>
</studentAction>
<studentAction>
<studentType>Middle</studentType>
<studentStatus>Completed</studentStatus>
</studentAction>
</studentActions>
</studentFile>
Can this be done using sed. I know there are tools like xsltproc but not sure if this is installed in all nodes in our cluster .
Any help will be appreciated. Thanks in advance!
xlmlint
, as the name implies, is for parsing and validating XML, not editing it. If you can installxmlstarlet
on your cluster, you can do the following:Update value with
xmllint
infile.xml
:or without here document:
Update: With bash and XML in a variable:
or without here document:
In case if xmlstarlet (a command line toolkit to query/edit/check/transform XML documents) is accessible:
The above will output the initial XML document with needed replacement
The command details:
ed -u
- edit/update mode//studentAction/studentStatus
- xpath expression to selectstudentStatus
element which has:preceding-sibling::studentType[1][text() = 'Juniour']
- preceding sibling elementstudentType
with valueJuniour
ancestor::student/studentName[text() = 'CLASSA']
- nearest elementstudentName
with valueCLASSA