Perform the following three XPath queries on the XML Document below:

 //item[1]: Retrieve the first "item" element 
 //price/text(): Perform an action on each "price" element (print it out)
 //name: Get an array of all the "name" elements
XML Document:

<inventory title="OmniCorp Store #45x10^3">
  <section name="health">
    <item upc="123456789" stock="12">
      <name>Invisibility Cream</name>
      <price>14.50</price>
      <description>Makes you invisible</description>
    </item>
    <item upc="445322344" stock="18">
      <name>Levitation Salve</name>
      <price>23.99</price>
      <description>Levitate yourself for up to 3 hours per application</description>
    </item>
  </section>
  <section name="food">
    <item upc="485672034" stock="653">
      <name>Blork and Freen Instameal</name>
      <price>4.95</price>
      <description>A tasty meal in a tablet; just add water</description>
    </item>
    <item upc="132957764" stock="44">
      <name>Grob winglets</name>
      <price>3.56</price>
      <description>Tender winglets of Grob. Just add water</description>
    </item>
  </section>
</inventory>

 
/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program xpathXml64.s   */
 
/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
.equ NBMAXELEMENTS,    100
 
/*******************************************/
/* Structures                               */
/********************************************/
/* structure xmlNode*/
    .struct  0
xmlNode_private:                         // application data
    .struct  xmlNode_private + 8 
xmlNode_type:                            // type number, must be second !
    .struct  xmlNode_type + 8
xmlNode_name:                            // the name of the node, or the entity
    .struct  xmlNode_name + 8 
xmlNode_children:                        // parent->childs link
    .struct  xmlNode_children + 8
xmlNode_last:                            // last child link
    .struct  xmlNode_last + 8
xmlNode_parent:                          // child->parent link 
    .struct  xmlNode_parent + 8
xmlNode_next:                            // next sibling link
    .struct  xmlNode_next + 8
xmlNode_prev:                            // previous sibling link 
    .struct  xmlNode_prev + 8
xmlNode_doc:                             // the containing document
    .struct  xmlNode_doc + 8
xmlNode_ns:                              // pointer to the associated namespace
    .struct  xmlNode_ns + 8
xmlNode_content:                         // the content
    .struct  xmlNode_content + 8
xmlNode_properties:                      // properties list
    .struct  xmlNode_properties + 8
xmlNode_nsDef:                           // namespace definitions on this node 
    .struct  xmlNode_nsDef + 8
xmlNode_psvi:                            // for type/PSVI informations
    .struct  xmlNode_psvi + 8
xmlNode_line:                            // line number
    .struct  xmlNode_line + 4
xmlNode_extra:                           // extra data for XPath/XSLT
    .struct  xmlNode_extra + 4
xmlNode_fin:
/********************************************/
/* structure xmlNodeSet*/
    .struct  0
xmlNodeSet_nodeNr:                       // number of nodes in the set
    .struct  xmlNodeSet_nodeNr + 4
xmlNodeSet_nodeMax:                      // size of the array as allocated 
    .struct  xmlNodeSet_nodeMax + 4
xmlNodeSet_nodeTab:                      // array of nodes in no particular order
    .struct  xmlNodeSet_nodeTab + 8
xmlNodeSet_fin:
/********************************************/
/* structure xmlXPathObject*/
    .struct  0
xmlPathObj_type:                         //
    .struct  xmlPathObj_type + 8
xmlPathObj_nodesetval:                   //
    .struct  xmlPathObj_nodesetval + 8
xmlPathObj_boolval:                      //
    .struct  xmlPathObj_boolval + 8
xmlPathObj_floatval:                     //
    .struct  xmlPathObj_floatval + 8
xmlPathObj_stringval:                    //
    .struct  xmlPathObj_stringval + 8
xmlPathObj_user:                         //
    .struct  xmlPathObj_user + 8
xmlPathObj_index:                        //
    .struct  xmlPathObj_index + 8
xmlPathObj_usex2:                        //
    .struct  xmlPathObj_usex2 + 8
xmlPathObj_index2:                       //
    .struct  xmlPathObj_index2 + 8
/*********************************/
/* Initialized data              */
/*********************************/
.data
szMessEndpgm:      .asciz "\nNormal end of program.\n" 
szMessDisVal:      .asciz "\nDisplay set values.\n" 
szMessDisArea:     .asciz "\nDisplay area values.\n" 
szFileName:        .asciz "testXml.xml" 
szMessError:       .asciz "Error detected !!!!. \n"
 
 
szLibName:         .asciz "name"
szLibPrice:        .asciz "//price"
szLibExtName:      .asciz "//name"
szCarriageReturn:  .asciz "\n"
 
 
/*********************************/
/* UnInitialized data            */
/*********************************/
.bss 
.align 4
tbExtract:          .skip 8 * NBMAXELEMENTS      // result extract area
/*********************************/
/*  code section                 */
/*********************************/
.text
.global main 
main:                                     // entry of program 
    ldr x0,qAdrszFileName 
    bl xmlParseFile                       // create doc
    cbz x0,99f                            // error ?
    mov x19,x0                            // doc address
    mov x0,x19                            // doc
    bl xmlDocGetRootElement               // get root
    bl xmlFirstElementChild               // get first section
    bl xmlFirstElementChild               // get first item
    bl xmlFirstElementChild               // get first name
    bl xmlNodeGetContent                  // extract content
    bl affichageMess                      // for display
    ldr x0,qAdrszCarriageReturn
    bl affichageMess
 
    ldr x0,qAdrszMessDisVal
    bl affichageMess
    mov x0,x19
    ldr x1,qAdrszLibPrice                 // extract prices
    bl extractValue
    mov x0,x19
    ldr x1,qAdrszLibExtName               // extract names
    bl extractValue
    ldr x0,qAdrszMessDisArea
    bl affichageMess
    mov x4,#0                             // display string result area
    ldr x5,qAdrtbExtract
1:
    ldr x0,[x5,x4,lsl #3]
    cbz x0,2f
    bl affichageMess
    ldr x0,qAdrszCarriageReturn
    bl affichageMess
    add x4,x4,1
    b 1b
2:
    mov x0,x19
    bl xmlFreeDoc
    bl xmlCleanupParser
    ldr x0,qAdrszMessEndpgm
    bl affichageMess
    b 100f
99:                                       // error
    ldr x0,qAdrszMessError
    bl affichageMess       
100:                                      // standard end of the program 
    mov x0,0                              // return code
    mov x8,EXIT                           // request to exit program
    svc 0                                 // perform the system call
 
qAdrszMessError:          .quad szMessError
qAdrszMessEndpgm:         .quad szMessEndpgm
qAdrszLibName:            .quad szLibName
qAdrszLibPrice:           .quad szLibPrice
qAdrszCarriageReturn:     .quad szCarriageReturn
qAdrszFileName:           .quad szFileName
qAdrszLibExtName:         .quad szLibExtName
qAdrtbExtract:            .quad tbExtract
qAdrszMessDisVal:          .quad szMessDisVal
qAdrszMessDisArea:         .quad szMessDisArea
/******************************************************************/
/*     extract value of set                                       */ 
/******************************************************************/
/* x0 contains the doc address
/* x1 contains the address of the libel to extract */
extractValue:
    stp x19,lr,[sp,-16]!                 // save  registers
    stp x20,x21,[sp,-16]!                // save  registers
    stp x22,x23,[sp,-16]!                // save  registers
    mov x20,x1                           // save address libel
    mov x19,x0                           // save doc
    bl xmlXPathNewContext                // create context
    mov x23,x0                           // save context
    mov x1,x0
    mov x0,x20
    bl xmlXPathEvalExpression
    mov x21,x0
    mov x0,x23
    bl xmlXPathFreeContext               // free context
    cmp x21,#0
    beq 100f
    ldr x14,[x21,#xmlPathObj_nodesetval] // values set
    ldr w23,[x14,#xmlNodeSet_nodeNr]     // set size
    mov x22,#0                           // index
    ldr x20,[x14,#xmlNodeSet_nodeTab]    // area of nodes
    ldr x21,qAdrtbExtract
1:                                       // start loop 
    ldr x3,[x20,x22,lsl #3]              // load node
    mov x0,x19
    ldr x1,[x3,#xmlNode_children]        // load string value
    mov x2,#1
    bl xmlNodeListGetString
    str x0,[x21,x22,lsl #3]              // store string pointer in area
    bl affichageMess                     // and display string result
    ldr x0,qAdrszCarriageReturn
    bl affichageMess
    add x22,x22,1
    cmp x22,x23
    blt 1b
100:
    ldp x22,x23,[sp],16                  // restaur  2 registers
    ldp x20,x21,[sp],16                  // restaur  2 registers
    ldp x19,lr,[sp],16                   // restaur  2 registers
    ret                                  // return to address lr x30
/********************************************************/
/*        File Include fonctions                        */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
 