Create a function that takes a list of character names and a list of corresponding remarks and returns an XML document of <Character> elements each with a name attributes and each enclosing its remarks.
All <Character> elements are to be enclosed in turn, in an outer <CharacterRemarks> element.

As an example, calling the function with the three names of:

April
Tam O'Shanter
Emily
And three remarks of:

Bubbly: I'm > Tam and <= Emily
Burns: "When chapman billies leave the street ..."
Short & shrift
Should produce the XML (but not necessarily with the indentation):

<CharacterRemarks>
    <Character name="April">Bubbly: I'm &gt; Tam and &lt;= Emily</Character>
    <Character name="Tam O'Shanter">Burns: "When chapman billies leave the street ..."</Character>
    <Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks>
The document may include an <?xml?> declaration and document type declaration, but these are optional. If attempting this task by direct string manipulation, the implementation must include code to perform entity substitution for the characters that have entities defined in the XML 1.0 specification.

Note: the example is chosen to show correct escaping of XML strings.
Note too that although the task is written to take two lists of corresponding data, a single mapping/hash/dictionary of names to remarks is also acceptable.

Note to editors: Program output with escaped characters will be viewed as the character on the page so you need to 'escape-the-escapes' to make the RC entry display what would be shown in a plain text viewer (See this).
Alternately, output can be placed in <lang xml></lang> tags without any special treatment.

 
/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program outputXml64.s   */
/* use special library libxml2   */
/* special link gcc with options -I/usr/include/libxml2 -lxml2 */
 
/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
/*********************************/
/* Initialized data              */
/*********************************/
.data
szMessEndpgm:      .asciz "Normal end of program.\n" 
szFileName:        .asciz "file2.xml" 
szFileMode:        .asciz "w"
szMessError:       .asciz "Error detected !!!!. \n"
szName1:           .asciz "April"
szName2:           .asciz "Tam O'Shanter"
szName3:           .asciz "Emily"
szRemark1:         .asciz "Bubbly: I'm > Tam and <= Emily"
szRemark2:         .asciz "Burns: \"When chapman billies leave the street ...\""
szRemark3:         .asciz "Short & shrift"
szVersDoc:         .asciz "1.0"
szLibCharRem:      .asciz "CharacterRemarks"
szLibChar:         .asciz "Character"
 
szLibName:         .asciz "Name"
szCarriageReturn:  .asciz "\n"
 
tbNames:           .quad szName1              // area of pointer string name
                   .quad szName2
                   .quad szName3
                   .quad 0                    // area end
tbRemarks:         .quad szRemark1            // area of pointer string remark
                   .quad szRemark2
                   .quad szRemark3
                   .quad 0                    // area end
/*********************************/
/* UnInitialized data            */
/*********************************/
.bss 
.align 4
 
/*********************************/
/*  code section                 */
/*********************************/
.text
.global main 
main:                                     // entry of program 
    ldr x0,qAdrszVersDoc
    bl xmlNewDoc                          // create doc
    mov x19,x0                            // doc address
    mov x0,#0
    ldr x1,qAdrszLibCharRem
    bl xmlNewNode                         // create root node
    mov x20,x0                            // node characterisation address
    mov x0,x19                            // doc
    mov x1,x20                            // node root
    bl xmlDocSetRootElement
    ldr x22,qAdrtbNames
    ldr x23,qAdrtbRemarks
    mov x24,#0                            // loop counter
1:                                        // start loop
    mov x0,#0
    ldr x1,qAdrszLibChar                  // create node
    bl xmlNewNode
    mov x21,x0                            // node character
                                          // x0 = node address
    ldr x1,qAdrszLibName
    ldr x2,[x22,x24,lsl #3]               // load name string address
    bl xmlNewProp
    ldr x0,[x23,x24,lsl #3]               // load remark string address
    bl xmlNewText
    mov x1,x0
    mov x0,x21
    bl xmlAddChild
    mov x0,x20
    mov x1,x21
    bl xmlAddChild
    add x24,x24,#1
    ldr x2,[x22,x24,lsl #3]                // load name string address
    cmp x2,#0                              // = zero ?
    bne 1b                                 // no -> loop
 
    ldr x0,qAdrszFileName 
    ldr x1,qAdrszFileMode
    bl fopen                               // file open
    cmp x0,#0
    blt 99f
    mov x24,x0                              //FD
    mov x1,x19
    mov x2,x20
    bl xmlDocDump                          // write doc on the file
 
    mov x0,x24                             // close file
    bl fclose
    mov x0,x19                             // close document
    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
qAdrszVersDoc:            .quad szVersDoc
qAdrszLibCharRem:         .quad szLibCharRem
qAdrszLibChar:            .quad szLibChar
qAdrszLibName:            .quad szLibName
qAdrtbNames:              .quad tbNames
qAdrtbRemarks:            .quad tbRemarks
qAdrszCarriageReturn:     .quad szCarriageReturn
qStdout:                  .quad STDOUT
qAdrszFileName:           .quad szFileName
qAdrszFileMode:           .quad szFileMode
 
/************************************/       
/* Strings comparaison              */
/************************************/      
/* x0 et x1 contains strings addresses */
/* x0 return 0 dans x0 if equal */
/* return -1 if string x0 < string x1 */
/* return 1  if string x0 > string x1 */
comparString:
    stp x2,lr,[sp,-16]!            // save  registers
    stp x3,x4,[sp,-16]!            // save  registers
    mov x2,#0                   // indice
1:    
    ldrb w3,[x0,x2]             // one byte string 1
    ldrb w4,[x1,x2]             // one byte string 2
    cmp w3,w4
    blt 2f                      // less
    bgt 3f                      // greather
    cmp w3,#0                   // 0 final
    beq 4f                      // equal and end
    add x2,x2,#1                // 
    b 1b                        // else loop
2:
    mov x0,#-1                  // less
    b 100f
3:
    mov x0,#1                   // greather
    b 100f
4:
    mov x0,#0                   // equal
    b 100f
100:
    ldp x3,x4,[sp],16           // restaur  2 registers
    ldp x2,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"
 