XML/Output: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
m (→‎{{header|Racket}}: remove unnecessary import)
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(71 intermediate revisions by 38 users not shown)
Line 1:
{{task|XML}}
Create a function that takes a list of character names and a list of corresponding remarks and returns an XML document of <code><Character></code> elements each with a name attributes and each enclosing its remarks. All <code><Character></code> elements are to be enclosed in turn, in an outer <code><CharacterRemarks></code> element.
All <code><Character></code> elements are to be enclosed in turn, in an outer <code><CharacterRemarks></code> element.
 
As an example, calling the function with the three names of:
Line 13 ⟶ 14:
Short & shrift</pre>
Should produce the XML (but not necessarily with the indentation):
<langsyntaxhighlight lang="xml"><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></langsyntaxhighlight>
 
The document may include an <tt><?xml?></tt> 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.
Line 24 ⟶ 25:
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 [[Talk:XML_Creation#Escaping_Escapes|this]]). Alternately, output can be placed in <nowiki><lang xml></lang></nowiki> tags without any special treatment.
Alternately, output can be placed in <nowiki><syntaxhighlight lang="xml"></syntaxhighlight></nowiki> tags without any special treatment.
 
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
/* 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"
</syntaxhighlight>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">DEFINE PTR="CARD"
DEFINE CHARACTER_SIZE="4"
TYPE Character=[PTR name,remark]
 
PTR FUNC GetCharacterPointer(BYTE ARRAY d INT index)
RETURN (d+index*CHARACTER_SIZE)
 
PROC SetCharacter(BYTE ARRAY d INT index CHAR ARRAY n,r)
Character POINTER ch
 
ch=GetCharacterPointer(d,index)
ch.name=n
ch.remark=r
RETURN
 
PROC PrintEscaped(CHAR ARRAY s)
INT i
CHAR c
 
FOR i=1 TO s(0)
DO
c=s(i)
IF c='< THEN
Print("&lt;")
ELSEIF c='> THEN
Print("&gt;")
ELSEIF c='& THEN
Print("&amp;")
ELSE
Put(c)
FI
OD
RETURN
 
PROC OutputNode(CHAR ARRAY node,tagName,tagValue BYTE closing)
Put('<)
IF closing THEN Put('/) FI
Print(node)
IF tagName(0)>0 THEN
PrintF(" %S=""",tagName)
PrintEscaped(tagValue) Put('")
FI
Put('>)
RETURN
 
PROC OutputCharacter(Character POINTER ch)
CHAR ARRAY node="Character"
 
OutputNode(node,"name",ch.name,0)
PrintEscaped(ch.remark)
OutputNode(node,"","",1)
RETURN
 
PROC OutputCharacters(BYTE ARRAY d INT count)
CHAR ARRAY node="CharacterRemarks"
Character POINTER ch
INT i
 
OutputNode(node,"","",0) PutE()
FOR i=0 TO count-1
DO
ch=GetCharacterPointer(d,i)
OutputCharacter(ch) PutE()
OD
OutputNode(node,"","",1) PutE()
RETURN
 
PROC Main()
BYTE count=[3]
BYTE ARRAY d(12)
 
SetCharacter(d,0,"April","Bubbly: I'm > Tam and <= Emily")
SetCharacter(d,1,"Tam O'Shanter","Burns: ""When chapman billies leave the street ...""")
SetCharacter(d,2,"Emily","Short & shrift")
 
OutputCharacters(d,count)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/XML_Output.png Screenshot from Atari 8-bit computer]
<pre>
<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>
</pre>
 
=={{header|Ada}}==
{{works with|GNAT}}
Line 31 ⟶ 293:
 
character_remarks.adb:
<langsyntaxhighlight Adalang="ada">with Ada.Strings.Unbounded;
with Ada.Text_IO.Text_Streams;
with DOM.Core.Documents;
Line 70 ⟶ 332:
N => My_Document,
Pretty_Print => True);
end Character_Remarks;</langsyntaxhighlight>
 
=== Alternative version using Matreshka ===
Line 76 ⟶ 338:
Uses [http://forge.ada-ru.org/matreshka Matreshka SAX API for XML].
 
<langsyntaxhighlight Adalang="ada">with Ada.Wide_Wide_Text_IO;
 
with League.Strings;
Line 128 ⟶ 390:
(+"Tam O'Shanter", +"Burns: ""When chapman billies leave the street ..."""),
(+"Emily", +"Short & shrift")));
end Main;</langsyntaxhighlight>
 
=={{header|ALGOL 68}}==
<syntaxhighlight lang="algol68"># returns a translation of str suitable for attribute values and content in an XML document #
OP TOXMLSTRING = ( STRING str )STRING:
BEGIN
STRING result := "";
FOR pos FROM LWB str TO UPB str DO
CHAR c = str[ pos ];
result +:= IF c = "<" THEN "&lt;"
ELIF c = ">" THEN "&gt;"
ELIF c = "&" THEN "&amp;"
ELIF c = "'" THEN "&apos;"
ELIF c = """" THEN "&quot;"
ELSE c
FI
OD;
result
END; # TOXMLSTRING #
 
# generate a CharacterRemarks XML document from the characters and remarks #
# the number of elements in characters and remrks must be equal - this is not checked #
# the <?xml?> element is not generated #
PROC generate character remarks document = ( []STRING characters, remarks )STRING:
BEGIN
STRING result := "<CharacterRemarks>";
INT remark pos := LWB remarks;
FOR char pos FROM LWB characters TO UPB characters DO
result +:= "<Character name=""" + TOXMLSTRING characters[ char pos ] + """>"
+ TOXMLSTRING remarks[ remark pos ]
+ "</Character>"
+ REPR 10
;
remark pos +:= 1
OD;
result +:= "</CharacterRemarks>";
result
END; # generate character remarks document #
 
# test the generation #
print( ( generate character remarks document( ( "April", "Tam O'Shanter", "Emily" )
, ( "Bubbly: I'm > Tam and <= Emily"
, "Burns: ""When chapman billies leave the street ..."
, "Short & shrift"
)
)
, newline
)
)
</syntaxhighlight>
{{out}}
<syntaxhighlight lang="xml"><CharacterRemarks><Character name="April">Bubbly: I&apos;m &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O&apos;Shanter">Burns: &quot;When chapman billies leave the street ...</Character>
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks></syntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
/* ARM assembly Raspberry PI */
/* program outputXml.s */
 
/* Constantes */
.equ STDOUT, 1 @ Linux output console
.equ EXIT, 1 @ Linux syscall
.equ WRITE, 4 @ Linux syscall
 
 
/*********************************/
/* 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"
 
//szLibExtract: .asciz "Student"
szLibName: .asciz "Name"
szCarriageReturn: .asciz "\n"
 
tbNames: .int szName1 @ area of pointer string name
.int szName2
.int szName3
.int 0 @ area end
tbRemarks: .int szRemark1 @ area of pointer string remark
.int szRemark2
.int szRemark3
.int 0 @ area end
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
.align 4
 
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: @ entry of program
ldr r0,iAdrszVersDoc
bl xmlNewDoc @ create doc
mov r9,r0 @ doc address
mov r0,#0
ldr r1,iAdrszLibCharRem
bl xmlNewNode @ create root node
mov r8,r0 @ node characterisation address
mov r0,r9 @ doc
mov r1,r8 @ node root
bl xmlDocSetRootElement
ldr r4,iAdrtbNames
ldr r5,iAdrtbRemarks
mov r6,#0 @ loop counter
1: @ start loop
mov r0,#0
ldr r1,iAdrszLibChar @ create node
bl xmlNewNode
mov r7,r0 @ node character
@ r0 = node address
ldr r1,iAdrszLibName
ldr r2,[r4,r6,lsl #2] @ load name string address
bl xmlNewProp
ldr r0,[r5,r6,lsl #2] @ load remark string address
bl xmlNewText
mov r1,r0
mov r0,r7
bl xmlAddChild
mov r0,r8
mov r1,r7
bl xmlAddChild
add r6,#1
ldr r2,[r4,r6,lsl #2] @ load name string address
cmp r2,#0 @ = zero ?
bne 1b @ no -> loop
 
ldr r0,iAdrszFileName
ldr r1,iAdrszFileMode
bl fopen @ file open
cmp r0,#0
blt 99f
mov r6,r0 @FD
mov r1,r9
mov r2,r8
bl xmlDocDump @ write doc on the file
 
mov r0,r6
bl fclose
mov r0,r9
bl xmlFreeDoc
bl xmlCleanupParser
ldr r0,iAdrszMessEndpgm
bl affichageMess
b 100f
99:
@ error
ldr r0,iAdrszMessError
bl affichageMess
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc #0 @ perform the system call
 
iAdrszMessError: .int szMessError
iAdrszMessEndpgm: .int szMessEndpgm
iAdrszVersDoc: .int szVersDoc
iAdrszLibCharRem: .int szLibCharRem
iAdrszLibChar: .int szLibChar
iAdrszLibName: .int szLibName
iAdrtbNames: .int tbNames
iAdrtbRemarks: .int tbRemarks
iAdrszCarriageReturn: .int szCarriageReturn
iStdout: .int STDOUT
iAdrszFileName: .int szFileName
iAdrszFileMode: .int szFileMode
/******************************************************************/
/* display text with size calculation */
/******************************************************************/
/* r0 contains the address of the message */
affichageMess:
push {r0,r1,r2,r7,lr} @ save registres
mov r2,#0 @ counter length
1: @ loop length calculation
ldrb r1,[r0,r2] @ read octet start position + index
cmp r1,#0 @ if 0 its over
addne r2,r2,#1 @ else add 1 in the length
bne 1b @ and loop
@ so here r2 contains the length of the message
mov r1,r0 @ address message in r1
mov r0,#STDOUT @ code to write to the standard output Linux
mov r7, #WRITE @ code call system "write"
svc #0 @ call systeme
pop {r0,r1,r2,r7,lr} @ restaur registers */
bx lr @ return
/******************************************************************/
/* Converting a register to a decimal */
/******************************************************************/
/* r0 contains value and r1 address area */
.equ LGZONECAL, 10
conversion10:
push {r1-r4,lr} @ save registers
mov r3,r1
mov r2,#LGZONECAL
1: @ start loop
bl divisionpar10 @ r0 <- dividende. quotient ->r0 reste -> r1
add r1,#48 @ digit
strb r1,[r3,r2] @ store digit on area
cmp r0,#0 @ stop if quotient = 0
subne r2,#1 @ previous position
bne 1b @ else loop
@ end replaces digit in front of area
mov r4,#0
2:
ldrb r1,[r3,r2]
strb r1,[r3,r4] @ store in area begin
add r4,#1
add r2,#1 @ previous position
cmp r2,#LGZONECAL @ end
ble 2b @ loop
mov r1,#' '
3:
strb r1,[r3,r4]
add r4,#1
cmp r4,#LGZONECAL @ end
ble 3b
100:
pop {r1-r4,lr} @ restaur registres
bx lr @return
/***************************************************/
/* division par 10 signé */
/* Thanks to http://thinkingeek.com/arm-assembler-raspberry-pi/*
/* and http://www.hackersdelight.org/ */
/***************************************************/
/* r0 dividende */
/* r0 quotient */
/* r1 remainder */
divisionpar10:
/* r0 contains the argument to be divided by 10 */
push {r2-r4} @ save registers */
mov r4,r0
mov r3,#0x6667 @ r3 <- magic_number lower
movt r3,#0x6666 @ r3 <- magic_number upper
smull r1, r2, r3, r0 @ r1 <- Lower32Bits(r1*r0). r2 <- Upper32Bits(r1*r0)
mov r2, r2, ASR #2 @ r2 <- r2 >> 2
mov r1, r0, LSR #31 @ r1 <- r0 >> 31
add r0, r2, r1 @ r0 <- r2 + r1
add r2,r0,r0, lsl #2 @ r2 <- r0 * 5
sub r1,r4,r2, lsl #1 @ r1 <- r4 - (r2 * 2) = r4 - (r0 * 10)
pop {r2-r4}
bx lr @ return
 
</syntaxhighlight>
{{output}}
<pre>
more file2.xml =
<?xml version="1.0"?>
<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>
</pre>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">gosub constants
names := xmlescape(names)
remarks := xmlescape(remarks)
Line 180 ⟶ 711:
Short & shrift
)
return</langsyntaxhighlight>
 
=={{header|BASIC}}==
{{works with|FreeBASIC}}
<lang basic>Data "April", "Bubbly: I'm > Tam and <= Emily", _
"Tam O'Shanter", "Burns: ""When chapman billies leave the street ...""", _
"Emily", "Short & shrift"
 
==={{header|Applesoft BASIC}}===
Declare Function xmlquote(ByRef s As String) As String
<syntaxhighlight lang="applesoftbasic">100 Q$ = CHR$(34)
Dim n As Integer, dev As String, remark As String
110 DE$(0) = "April"
120 RE$(0) = "Bubbly: I'm > Tam and <= Emily"
130 DE$(1) = "Tam O'Shanter"
140 RE$(1) = "Burns: " + Q$ + "When chapman billies leave the street ..." + Q$
150 DE$(2) = "Emily"
160 RE$(2) = "Short & shrift"
200 Print "<CharacterRemarks>"
210 For I = 0 to 2
220 Print " <Character name="Q$;
230 X$=DE$(I) : GOSUB 300xmlquote
240 PRINT Q$">";
250 X$=RE$(I) : GOSUB 300xmlquote
260 PRINT "</Character>"
270 Next
280 Print "</CharacterRemarks>"
290 End
 
300 For n = 1 To Len(X$)
Print "<CharacterRemarks>"
310 c$ = Mid$(X$,n,1)
For n = 0 to 2
320 IF C$ = "<" THEN C$ = "&lt;"
Read dev, remark
330 IF C$ = ">" THEN C$ = "&gt;"
Print " <Character name="""; xmlquote(dev); """>"; _
340 IF C$ = "&" xmlquote(remark);THEN C$ = "</Character>&amp;"
350 IF C$ = Q$ THEN C$ = "&quot;"
Next
360 IF C$ = "'" THEN C$ = "&apos;"
Print "</CharacterRemarks>"
370 PRINT C$;
380 NEXT N
390 RETURN</syntaxhighlight>
 
End
 
==={{header|Commodore BASIC}}===
Function xmlquote(ByRef s As String) As String
 
Dim n As Integer
Not terribly different from the Applesoft BASIC example above, but this allows for a few more character/entity translations.
Dim r As String
 
For n = 0 To Len(s)
<syntaxhighlight lang="gwbasic">1 rem xml/output - commodore basic
Dim c As String
2 rem rosetta code
c = Mid(s,n,1)
5 print chr$(147);chr$(14):gosub 900
Select Case As Const Asc(c)
10 rem set up array structure for data
Case Asc("<")
11 rem we'll use a multi-dimensional array:
r = r + "&lt;"
12 rem c$(x,y) where x is the rows and y is the fields
Case Asc(">")
13 rem two fields: 0 = character name, 1 = remarks
r = r + "&gt;"
15 dim c$(10,1):x=0:q$=chr$(34)
Case Asc("&")
19 rem now read the data to populate the structure
r = r + "&amp;"
20 for y=0 to 1
Case Asc("""")
25 read t$
r = r + "&quot;"
30 if t$="[end]" then x=x-1:goto 45
Case Asc("'")
35 c$(x,y)=t$:print t$
r = r + "&apos;"
40 next y:x=x+1:print:goto 20
Case Else
45 rem need to sanitize for html entities
r = r + c
50 gosub 500
End Select
55 rem now we parse it out to xml format
Next
60 print:print:gosub 150
Function = r
70 end
End Function</lang>
75 :
150 print "<CharacterRemarks>"
155 for i=0 to x
160 t$="<Character name="+q$+c$(i,0)+q$+">"
165 t$=t$+c$(i,1)+"</Character>"
170 print " ";t$
175 next i
180 print "</CharacterRemarks>"
185 print
190 return
195 :
500 rem code html entities
505 for i=0 to x
510 for j=0 to 1
515 tm$=c$(i,j):tl=len(tm$):zz$=""
520 for tc=1 to tl
525 tc$=mid$(tm$,tc,1):cv=asc(tc$) and 127
530 zz$=zz$+et$(cv)
535 next tc
540 c$(i,j)=zz$
545 next j,i
550 return
555 :
900 rem set up entity lookup table
905 dim et$(127):for i=0 to 127:et$(i)=chr$(i):next
910 for i=1 to 15:read ci,et$(ci):next i:return
915 data 34,"&quot;",63,"&quest;",35,"&num;",64,"&commat;",47,"&sol;"
920 data 60,"&lt;",62,"&gt;",91,"&lsqb;",93,"rsqb;",92,"&pound;"
925 data 36,"&dollar;",37,"&percnt;",94,"&uarr;",95,"&larr;"
930 data 38,"&amp;"
935 :
1000 data "April","Bubble: I'm > Tam and <= Emily"
1005 data "Tam O'Shanter","Burns: 'When chapman billies leave the street...'"
1010 data "Emily","Short & shrift"
1015 data "Joey","Always look ^."
1999 data "[end]","[end]"</syntaxhighlight>
 
{{out}}
 
<pre>April
Bubble: I'm > Tam and <= Emily
Tam O'Shanter
Burns: 'When chapman billies leave the street...'
Emily
Short & shrift
Joey
Always look &uarr;.
 
<CharacterRemarks>
<Character name="April">Bubble: 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>
<Character name="Joey">Always look &uarr;.</Character>
</CharacterRemarks>
ready.
&#9608;</pre>
 
=={{header|Bracmat}}==
<syntaxhighlight lang="bracmat">( ( 2XML
= PCDATAentities attributeValueEntities doAll doAttributes
, xml
. ( attributeValueEntities
= a c
. @( !arg
: ?a
(("<"|"&"|\"):?c)
?arg
)
& !a
"&"
( !c:"<"&lt
| !c:"&"&amp
| quot
)
";"
attributeValueEntities$!arg
| !arg
)
& ( PCDATAentities
= a c
. @( !arg
: ?a
(("<"|"&"|">"):?c)
?arg
)
& !a
"&"
( !c:"<"&lt
| !c:"&"&amp
| gt
)
";"
PCDATAentities$!arg
| !arg
)
& ( doAttributes
= a v
. !arg:(?a.?v) ?arg
& " "
PCDATAentities$!a
"=\""
attributeValueEntities$!v
\"
doAttributes$!arg
|
)
& ( doAll
= xml first A B C att XML
. !arg:?xml
& :?XML
& whl
' ( !xml:%?first ?xml
& ( !first:(?A.?B)
& ( !B:(?att,?C)
& !XML
( !C:
& "<" !A doAttributes$!att " />\n"
| "<"
!A
doAttributes$!att
">"
doAll$!C
"</"
!A
">\n"
)
: ?XML
| !A
: ( "!"&!XML "<!" !B ">":?XML
| "!--"
& !XML "<!--" !B "-->":?XML
| "?"&!XML "<?" !B "?>\n":?XML
| "![CDATA["
& !XML "<![CDATA[" !B "]]>":?XML
| "!DOCTYPE"
& !XML "<!DOCTYPE" !B ">":?XML
| ?
& !XML "<" !A doAttributes$!B ">":?XML
)
)
| !XML PCDATAentities$!first:?XML
)
)
& str$!XML
)
& doAll$!arg
)
& ( makeList
= characters name names remark remarks
. !arg:(?names.?remarks)
& :?characters
& whl
' ( (!names.!remarks)
: (%?name ?names.%?remark ?remarks)
& !characters (Character.(name.!name),!remark)
: ?characters
)
& ("?".xml) (CharacterRemarks.,!characters)
)
& put
$ ( 2XML
$ ( makeList
$ ( April "Tam O'Shanter" Emily
. "Bubbly: I'm > Tam and <= Emily"
"Burns: \"When chapman billies leave the street ...\""
"Short & shrift"
)
)
)
)</syntaxhighlight>
{{out}}
<pre><?xml?>
<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></pre>
 
=={{header|C}}==
==={{libheader|libXML}}===
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 265 ⟶ 994:
return EXIT_SUCCESS;
}</langsyntaxhighlight>
 
==={{libheader|Gadget}}===
<syntaxhighlight lang="c">
#include <gadget/gadget.h>
 
LIB_GADGET_START
 
const char* codes[] = {"&amp;","&gt;","&lt;"};
const char* repl[] = {"&",">","<"};
char* change_codes( const char* xml_line )
{
int i;
String xml;
Let( xml, xml_line );
Iterator up i [0:1:3]{
Get_fn_let( xml, Str_tran( xml, repl[i], codes[i] ) );
}
return xml;
}
char* generate_xml( const char* names[], int lnames, const char* remarks[] )
{
String xml;
char attrib[100];
int i;
Iterator up i [0:1:lnames]{
String remk;
Get_fn_let ( remk, change_codes( remarks[i] ) );
sprintf(attrib,"name=\"%s\"",names[i]);
if(!i) {
Get_fn_let ( xml, Parser("Character", attrib, remk, NORMAL_TAG ));
}else{
Get_fn_cat ( xml, Parser("Character", attrib, remk, NORMAL_TAG ));
}
Free secure remk;
}
Get_fn_let ( xml, Parser("CharacterRemarks", "", xml, NORMAL_TAG ));
Get_fn_let ( xml, Str_tran(xml,"><",">\n<") );
return xml;
}
 
#define alen(_X_) ( sizeof(_X_) / sizeof(const char*) )
Main
const char *names[] = {
"April", "Tam O'Shanter", "Emily"
};
const char *remarks[] = {
"Bubbly: I'm > Tam and <= Emily",
"Burns: \"When chapman billies leave the street ...\"",
"Short & shrift"
};
char* xml = generate_xml( names, alen(names), remarks );
Print "%s\n", xml;
Free secure xml;
End
</syntaxhighlight>
{{out}}
 
$ ./tests/RC_xmlout
<syntaxhighlight lang="xml">
<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>
</syntaxhighlight>
 
=={{header|C sharp}}==
{{works with|C sharp|C#|3.0+}}
<syntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
 
class Program
{
static string CreateXML(Dictionary<string, string> characterRemarks)
{
var remarks = characterRemarks.Select(r => new XElement("Character", r.Value, new XAttribute("Name", r.Key)));
var xml = new XElement("CharacterRemarks", remarks);
return xml.ToString();
}
 
static void Main(string[] args)
{
var characterRemarks = new Dictionary<string, string>
{
{ "April", "Bubbly: I'm > Tam and <= Emily" },
{ "Tam O'Shanter", "Burns: \"When chapman billies leave the street ...\"" },
{ "Emily", "Short & shrift" }
};
 
string xml = CreateXML(characterRemarks);
Console.WriteLine(xml);
}
}</syntaxhighlight>
 
=={{header|C++}}==
Library: Boost
<langsyntaxhighlight lang="cpp">#include <vector>
#include <utility>
#include <iostream>
Line 314 ⟶ 1,140:
xmlstring.append( "</CharacterRemarks>" ) ;
return xmlstring ;
}</langsyntaxhighlight>
 
=={{header|C sharp}}==
{{works with|C sharp|C#|3.0+}}
<lang csharp>using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
 
class Program
{
static string CreateXML(Dictionary<string, string> characterRemarks)
{
var remarks = characterRemarks.Select(r => new XElement("Character", r.Value, new XAttribute("Name", r.Key)));
var xml = new XElement("CharacterRemarks", remarks);
return xml.ToString();
}
 
static void Main(string[] args)
{
var characterRemarks = new Dictionary<string, string>
{
{ "April", "Bubbly: I'm > Tam and <= Emily" },
{ "Tam O'Shanter", "Burns: \"When chapman billies leave the street ...\"" },
{ "Emily", "Short & shrift" }
};
 
string xml = CreateXML(characterRemarks);
Console.WriteLine(xml);
}
}</lang>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="lisp">(use 'clojure.xml)
(defn character-remarks-xml [characters remarks]
(with-out-str (emit-element
Line 355 ⟶ 1,151:
{:tag :Character,
:attrs {:name (item 0)},
:content [(item 1)]}) )})))</langsyntaxhighlight>
 
=={{header|Common Lisp}}==
Line 361 ⟶ 1,157:
{{libheader|Closure XML}}
 
<langsyntaxhighlight lang="lisp">(defun write-xml (characters lines &optional (out *standard-output*))
(let* ((doc (dom:create-document 'rune-dom:implementation nil nil nil))
(chars (dom:append-child doc (dom:create-element doc "Characters"))))
Line 370 ⟶ 1,166:
(dom:append-child chars c)))
characters lines)
(write-string (dom:map-document (cxml:make-rod-sink) doc) out)))</langsyntaxhighlight>
 
Example of use:
 
<langsyntaxhighlight lang="lisp">(write-xml '("April" "Tam O'Shanter" "Emily")
'("Bubbly: I'm > Tam and <= Emily"
"Burns: \"When chapman billies leave the street ...\""
"Short & shrift"))</langsyntaxhighlight>
 
{{out}}
output:
<div style="width:full;overflow:scroll">
<pre><?xml version="1.0" encoding="UTF-8"?>
Line 386 ⟶ 1,182:
=={{header|D}}==
{{libheader|KXML}}
<langsyntaxhighlight lang="d">import kxml.xml;
char[][][]characters =
[["April","Bubbly: I'm > Tam and <= Emily"],
Line 403 ⟶ 1,199:
addChars(root,characters);
std.stdio.writefln("%s",root.write);
}</langsyntaxhighlight>
<pre>
<?xml?>
Line 420 ⟶ 1,216:
 
=={{header|Delphi}}==
<syntaxhighlight lang="delphi">
<lang Delphi>
//You need to use these units
uses
Line 497 ⟶ 1,293:
end;
 
</syntaxhighlight>
</lang>
 
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
-module( xml_output ).
 
-export( [task/0] ).
 
-include_lib("xmerl/include/xmerl.hrl").
 
task() ->
Data = {'CharacterRemarks', [], [{'Character', [{name, X}], [[Y]]} || {X, Y} <- contents()]},
lists:flatten( xmerl:export_simple([Data], xmerl_xml) ).
 
 
contents() -> [{"April", "Bubbly: I'm > Tam and <= Emily"}, {"Tam O'Shanter", "Burns: \"When chapman billies leave the street ...\""}, {"Emily", "Short & shrift"}].
</syntaxhighlight>
{{out}}
<pre>
4> xml_output:task().
"<?xml version=\"1.0\"?><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>"
</pre>
 
=={{header|Euphoria}}==
{{trans|BASIC}}
<langsyntaxhighlight lang="euphoria">function xmlquote(sequence s)
sequence r
r = ""
Line 534 ⟶ 1,351:
puts(1,"</Character>\n")
end for
puts(1,"</CharacterRemarks>\n")</langsyntaxhighlight>
 
{{out}}
Output:
<lang xmlpre><CharacterRemarks>
<CharacterName="April">Bubbly: I&apos;m &gt; Tam and &lt;= Emily</Character>
<CharacterName="Tam O&apos;Shanter">Burns: &quot;When chapman billies leave the street ...&quot;</Character>
<CharacterName="Emily">Short &amp; shrift</Character>
</CharacterRemarks>
</langpre>
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">#light
 
open System.Xml
Line 566 ⟶ 1,383:
root.AppendChild node |> ignore
) characters
doc.OuterXml</langsyntaxhighlight>
<pre><CharacterRemarks>
<Character name="April">Bubbly: I'm &amp;gt; Tam and &amp;lt;= Emily</Character>
Line 574 ⟶ 1,391:
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: sequences xml.syntax xml.writer ;
 
: print-character-remarks ( names remarks -- )
[ [XML <Character name=<-> ><-></Character> XML] ] 2map
[XML <CharacterRemarks><-></CharacterRemarks> XML] pprint-xml ;</langsyntaxhighlight>
Example of usage:
<langsyntaxhighlight lang="factor">{ "April" "Tam O'Shanter" "Emily" } {
"Bubbly: I'm > Tam and <= Emily"
"Burns: \"When chapman billies leave the street ...\""
"Short & shrift"
} print-remarks</langsyntaxhighlight>
 
=={{header|Fantom}}==
<langsyntaxhighlight lang="fantom">
using xml
 
Line 614 ⟶ 1,431:
}
}
</syntaxhighlight>
</lang>
 
Output{{out}} (not exactly conforming):
<pre>
<?xml version='1.0' encoding='UTF-8'?>
Line 630 ⟶ 1,447:
{{libheader|Forth Foundation Library}}
 
<langsyntaxhighlight lang="forth">include ffl/est.fs
include ffl/xos.fs
 
Line 670 ⟶ 1,487:
 
\ Output xml string
xml str-get type cr</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="basic">Data "April", "Bubbly: I'm > Tam and <= Emily", _
"Tam O'Shanter", "Burns: ""When chapman billies leave the street ...""", _
"Emily", "Short & shrift"
 
Declare Function xmlquote(ByRef s As String) As String
Dim n As Integer, dev As String, remark As String
 
Print "<CharacterRemarks>"
For n = 0 to 2
Read dev, remark
Print " <Character name="""; xmlquote(dev); """>"; _
xmlquote(remark); "</Character>"
Next
Print "</CharacterRemarks>"
 
End
 
Function xmlquote(ByRef s As String) As String
Dim n As Integer
Dim r As String
For n = 0 To Len(s)
Dim c As String
c = Mid(s,n,1)
Select Case As Const Asc(c)
Case Asc("<")
r = r + "&lt;"
Case Asc(">")
r = r + "&gt;"
Case Asc("&")
r = r + "&amp;"
Case Asc("""")
r = r + "&quot;"
Case Asc("'")
r = r + "&apos;"
Case Else
r = r + c
End Select
Next
Function = r
End Function</syntaxhighlight>
 
=={{header|Go}}==
'''Using package xml to marshal from a data structure:'''
<langsyntaxhighlight lang="go">package main
 
import (
Line 707 ⟶ 1,567:
}
fmt.Println(x)
}</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight lang="xml"><CharacterRemarks>
<Character name="April">Bubbly: I&#39;m &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O&#39;Shanter">Burns: &#34;When chapman billies leave the street ...&#34;</Character>
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks></langsyntaxhighlight>
 
Using the text/template package to generate text:
(but still leaning on the xml package for escaping.)
<langsyntaxhighlight lang="go">package main
 
import (
"bytes"
"encoding/xml"
"fmt"
"strings"
"text/template"
)
Line 735 ⟶ 1,596:
 
func xmlEscapeString(s string) string {
var b bytesstrings.BufferBuilder
xml.Escape(&b, []byte(s))
return b.String()
Line 746 ⟶ 1,607:
// Define function required by task description.
xRemarks := func(crms []crm) (string, error) {
var b bytesstrings.BufferBuilder
err := xt.Execute(&b, crms)
return b.String(), err
Line 761 ⟶ 1,622:
}
fmt.Println(x)
}</langsyntaxhighlight>
Output is same as marshalled version.
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
def names = ["April", "Tam O'Shanter", "Emily"]
Line 774 ⟶ 1,635:
}
 
println writer.toString()</langsyntaxhighlight>
 
=={{header|Haskell}}==
This implementation uses the [http://hackage.haskell.org/package/xml <code>xml</code> package].
 
<langsyntaxhighlight lang="haskell">import Text.XML.Light
 
characterRemarks :: [String] -> [String] -> String
Line 791 ⟶ 1,652:
[Attr (unqual "name") name]
[Text $ CData CDataText remark Nothing]
Nothing</langsyntaxhighlight>
 
=={{header|HicEst}}==
<langsyntaxhighlight HicEstlang="hicest">CHARACTER names="April~Tam O'Shanter~Emily~"
CHARACTER remarks*200/%Bubbly: I'm > Tam and <= Emily~Burns: "When chapman billies leave the street ..."~Short & shrift~%/
CHARACTER XML*1000
Line 808 ⟶ 1,669:
XML = TRIM(XML) // '<Character name="' // name // '">' // remark // '</Character>' // $CRLF
ENDDO
XML = TRIM(XML) // "</CharacterRemarks>"</langsyntaxhighlight>
 
=={{header|J}}==
Line 814 ⟶ 1,675:
First create the table of substitutions and the verb which properly escapes the input string:
 
<langsyntaxhighlight lang="j">tbl=: ('&quote;'; '&amp;'; '&lt;'; '&gt;') (a.i.'"&<>')} <"0 a.
esc=: [:; {&tbl@:i.~&a.</langsyntaxhighlight>
 
Then create the verb which combines name with remark:
<langsyntaxhighlight Jlang="j">cmb=: [:; dyad define &.>
'<Character name="', (esc x), '">', (esc y), '</Character>', LF
)</langsyntaxhighlight>
 
Finally, create the verb which creates the final XML:
<langsyntaxhighlight lang="j">xmlify=: '<CharacterRemarks>', LF, cmb, '</CharacterRemarks>'"_</langsyntaxhighlight>
 
Example:
 
<langsyntaxhighlight lang="j">names=: 'April'; 'Tam O''Shanter'; 'Emily'
 
remarks=: <;._2]0 :0
Line 833 ⟶ 1,694:
Burns: "When chapman billies leave the street ..."
Short & shrift
)</langsyntaxhighlight>
 
<syntaxhighlight lang="text"> names xmlify remarks
<CharacterRemarks>
<Character name="April"> I'm &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O'Shanter"> Burns: &quote;When chapman billies leave the street ...&quote;</Character>
<Character name="Emily"> Short &amp; shrift</Character>
</CharacterRemarks></langsyntaxhighlight>
 
=={{header|Java}}==
===Using DOM===
<langsyntaxhighlight lang="java">import java.io.StringWriter;
 
import javax.xml.parsers.DocumentBuilderFactory;
Line 904 ⟶ 1,765:
}
}</langsyntaxhighlight>
 
Result:
<langsyntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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></langsyntaxhighlight>
 
===Using the Streaming API for XML (StAX)===
<langsyntaxhighlight lang="java">import java.io.StringWriter;
 
import javax.xml.stream.XMLOutputFactory;
Line 951 ⟶ 1,812:
}
}
}</langsyntaxhighlight>
 
This produces:
<langsyntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8"?><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></langsyntaxhighlight>
 
=={{header|Joy}}==
<syntaxhighlight lang="joy">
<lang Joy>
DEFINE subst ==
[[['< "&lt;" putchars]
Line 966 ⟶ 1,827:
XMLOutput ==
"<CharacterRemarks>\n" putchars
[ "<Character name=\"" putchars uncons swap putchars "\">" putchars first subst "</Character>\n" putchars] step
"</CharacterRemarks>\n" putchars.
 
[ [ "April" "Bubbly: I'm > Tam and <= Emily" ]
[ "Tam O'Shanter" "Burns: \"When chapman billies leave the street ...\"" ]
[ "Emily" "Short & shrift" ]
] XMLOutput.
</syntaxhighlight>
</lang>
 
=={{header|Mathematicajq}}==
{{trans|Wren}}
{{works with|jq}}
'''Also works with gojq, the Go implementation of jq'''
<syntaxhighlight lang=jq>
def escapes: [
["&" , "&amp;"], # must do this one first
["\"", "&quot;"],
["'" , "&apos;"],
["<" , "&lt;"],
[">" , "&gt;"]
];
 
def xmlEscape:
reduce escapes[] as $esc (.; gsub($esc[0]; $esc[1]));
 
def xmlDoc(names; remarks):
reduce range(0;names|length) as $i ("<CharacterRemarks>\n";
(names[$i]|xmlEscape) as $name
| (remarks[$i]|xmlEscape) as $remark
| . + " <Character name=\"\($name)\">\($remark)</Character>\n")
+ "</CharacterRemarks>" ;
 
def names: ["April", "Tam O'Shanter", "Emily"];
def remarks: [
"Bubbly: I'm > Tam and <= Emily",
"Burns: \"When chapman billies leave the street ...\"",
"Short & shrift"
];
 
xmlDoc(names; remarks)
</syntaxhighlight>
{{output}}
As for [[#Wren|Wren]].
 
=={{header|Julia}}==
<syntaxhighlight lang="julia">using LightXML
 
dialog = [("April", "Bubbly: I'm > Tam and <= Emily"),
("Tam O'Shanter", "Burns: \"When chapman billies leave the street ...\""),
("Emily", "Short & shrift")]
 
const xdoc = XMLDocument()
const xroot = create_root(xdoc, "CharacterRemarks")
 
for (name, remarks) in dialog
xs1 = new_child(xroot, "Character")
set_attribute(xs1, "name", name)
add_text(xs1, remarks)
end
 
println(xdoc)
</syntaxhighlight>{{output}}<pre>
<?xml version="1.0" encoding="utf-8"?>
<CharacterRemarks>
<Character name="April">Bubbly: I'm &amp;gt; Tam and &lt;= Emily</Character>
<Character name="Tam O'Shanter">Burns: "When chapman billies leave the street ..."</Character>
<Character name="Emily">Short &amp;amp; shrift</Character>
</CharacterRemarks>
</pre>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.1.3
 
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.dom.DOMSource
import java.io.StringWriter
import javax.xml.transform.stream.StreamResult
import javax.xml.transform.TransformerFactory
 
fun main(args: Array<String>) {
val names = listOf("April", "Tam O'Shanter", "Emily")
 
val remarks = listOf(
"Bubbly: I'm > Tam and <= Emily",
"Burns: \"When chapman billies leave the street ...\"",
"Short & shrift"
)
 
val dbFactory = DocumentBuilderFactory.newInstance()
val dBuilder = dbFactory.newDocumentBuilder()
val doc = dBuilder.newDocument()
val root = doc.createElement("CharacterRemarks") // create root node
doc.appendChild(root)
 
// now create Character elements
for (i in 0 until names.size) {
val character = doc.createElement("Character")
character.setAttribute("name", names[i])
val remark = doc.createTextNode(remarks[i])
character.appendChild(remark)
root.appendChild(character)
}
 
val source = DOMSource(doc)
val sw = StringWriter()
val result = StreamResult(sw)
val tFactory = TransformerFactory.newInstance()
tFactory.newTransformer().apply {
setOutputProperty("omit-xml-declaration", "yes")
setOutputProperty("indent", "yes")
setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4")
transform(source, result)
}
println(sw)
}
</syntaxhighlight>
 
{{out}}
<syntaxhighlight lang="xml"><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>
</syntaxhighlight>
 
=={{header|Lasso}}==
Lasso has built in support for both creating and parsing xml.
<syntaxhighlight lang="lasso">define character2xml(names::array, remarks::array) => {
 
fail_if(#names -> size != #remarks -> size, -1, 'Input arrays not of same size')
 
local(
domimpl = xml_domimplementation,
doctype = #domimpl -> createdocumenttype(
'svg:svg',
'-//W3C//DTD SVG 1.1//EN',
'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'
),
character_xml = #domimpl -> createdocument(
'http://www.w3.org/2000/svg',
'svg:svg',
#docType
),
csnode = #character_xml -> createelement('CharacterRemarks'),
charnode
)
 
#character_xml -> appendChild(#csnode)
 
loop(#names -> size) => {
#charnode = #character_xml -> createelement('Character')
#charnode -> setAttribute('name', #names -> get(loop_count))
#charnode -> nodeValue = encode_xml(#remarks -> get(loop_count))
#csnode -> appendChild(#charnode)
}
return #character_xml
 
}
 
character2xml(
array(`April`, `Tam O'Shanter`, `Emily`),
array(`Bubbly: I'm > Tam and <= Emily`, `Burns: "When chapman billies leave the street ..."`, `Short & shrift`)
)</syntaxhighlight>
{{out}}
<syntaxhighlight lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:svg="http://www.w3.org/2000/svg"/>
<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>
</syntaxhighlight>
 
=={{header|Lua}}==
Using the LuaXML library as available via luarocks. Note that strings in Lua can be enclosed in either single or double quotes to help reduce the need for escape characters.
<syntaxhighlight lang="lua">require("LuaXML")
 
function addNode(parent, nodeName, key, value, content)
local node = xml.new(nodeName)
table.insert(node, content)
parent:append(node)[key] = value
end
 
root = xml.new("CharacterRemarks")
addNode(root, "Character", "name", "April", "Bubbly: I'm > Tam and <= Emily")
addNode(root, "Character", "name", "Tam O'Shanter", 'Burns: "When chapman billies leave the street ..."')
addNode(root, "Character", "name", "Emily", "Short & shrift")
print(root)</syntaxhighlight>
{{out}}
<syntaxhighlight lang="xml"><CharacterRemarks>
<Character name="April">Bubbly: I&apos;m &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O&apos;Shanter">Burns: &quot;When chapman billies leave the street ...&quot;</Character>
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks></syntaxhighlight>
Note also that LuaXML escapes quote marks and apostrophes, which makes the output slightly different to the task requirement. This can be 'fixed' if necessary using Lua's in-built string.gsub function:
<syntaxhighlight lang="lua">xmlStr = xml.str(root):gsub("&apos;", "'"):gsub("&quot;", '"')
print(xmlStr)</syntaxhighlight>
{{out}}
<syntaxhighlight lang="xml"><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></syntaxhighlight>
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
Module CheckIt {
Flush
Data "April", {Bubbly: I'm > Tam and <= Emily}
Data "Tam O'Shanter", {Burns: "When chapman billies leave the street ..."}
Data "Emily", {Short & shrift}
declare xml xmlData
with xml, "xml" as doc$, "beautify" as beautify
method xml, "PrepareNode", "CharacterRemarks" as Node
method xml, "InsertNode", Node
while not empty
read name$, text$
method xml, "PrepareNode", "Character", text$ as Node1
method xml, "PlaceAttributeToNode", Node1, "name", name$
method xml, "AppendChild", Node1
end while
beautify=-4
Report doc$
}
CheckIt
</syntaxhighlight>
{{out}}
<syntaxhighlight lang="xml"><CharacterRemarks>
<Character name="April">Bubbly: I&apos;m &qt; Tam and &lt;= Emily</Character>
<Character name="Tam O'Shanter">Burns: &quot;When chapman billies leave the street ...&quot;</Character>
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks></syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Some tricky input with the second remark
<langsyntaxhighlight Mathematicalang="mathematica">c = {"April", "Tam O'Shanter","Emily"};
r = {"Bubbly:I'm > Tam and <= Emily" ,
StringReplace["Burns:\"When chapman billies leave the street ...\"", "\"" -> ""], "Short & shrift"};
 
ExportString[ XMLElement[ "CharacterRemarks", {},
{XMLElement["Character", {"name" -> c[[1]]}, {r[[1]]}],
XMLElement["Character", {"name" -> c[[2]]}, {r[[2]]}],
XMLElement["Character", {"name" -> c[[3]]}, {r[[3]]}]
}], "XML", "AttributeQuoting" -> "\""]</langsyntaxhighlight>
{{out}}
 
<pre><CharacterRemarks>
<Character name=\"April\">Bubbly:I'm &gt; Tam and &lt;= Emily</Character>
Line 992 ⟶ 2,080:
<Character name=\"Emily\">Short &amp; shrift</Character>
</CharacterRemarks></pre>
 
=={{header|MATLAB}}==
<syntaxhighlight lang="matlab">RootXML = com.mathworks.xml.XMLUtils.createDocument('CharacterRemarks');
docRootNode = RootXML.getDocumentElement;
thisElement = RootXML.createElement('Character');
thisElement.setAttribute('Name','April')
thisElement.setTextContent('Bubbly: I''m > Tam and <= Emily');
docRootNode.appendChild(thisElement);
thisElement = RootXML.createElement('Character');
thisElement.setAttribute('Name','Tam O''Shanter')
thisElement.setTextContent('Burns: "When chapman billies leave the street ..."');
docRootNode.appendChild(thisElement);
thisElement = RootXML.createElement('Character');
thisElement.setAttribute('Name','Emily')
thisElement.setTextContent('Short & shrift');
docRootNode.appendChild(thisElement);</syntaxhighlight>
 
{{out}}
 
<pre>
xmlwrite(RootXML)
 
ans =
 
<?xml version="1.0" encoding="utf-8"?>
<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>
</pre>
 
=={{header|NetRexx}}==
===Using DOM===
{{trans|Java}}
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
 
options replace format comments java crossref savelog symbols nobinary
Line 1,061 ⟶ 2,180:
 
return
</syntaxhighlight>
</lang>
;Output
<langsyntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8" standalone="no"?>
<CharacterRemarks>
<Character name="April">Bubbly: I'm &gt; Tam and &lt;= Emily</Character>
Line 1,069 ⟶ 2,188:
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks>
</syntaxhighlight>
</lang>
 
===Using the Streaming API for XML (StAX)===
{{trans|Java}}
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
 
options replace format comments java crossref savelog symbols nobinary
Line 1,121 ⟶ 2,240:
 
return
</syntaxhighlight>
</lang>
;Output
<langsyntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8"?>
<CharacterRemarks>
<Character name="April">Bubbly: I'm &gt; Tam and &lt;= Emily</Character>
Line 1,129 ⟶ 2,248:
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks>
</syntaxhighlight>
</lang>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import xmltree, strtabs, sequtils
 
proc charsToXML(names, remarks: seq[string]): XmlNode =
result = <>CharacterRemarks()
for name, remark in items zip(names, remarks):
result.add <>Character(name=name, remark.newText)
 
echo charsToXML(@["April", "Tam O'Shanter", "Emily"],
@["Bubbly: I'm > Tam and <= Emily",
"Burns: \"When chapman billies leave the street ...\"",
"Short & shrift"])</syntaxhighlight>
Output:
<syntaxhighlight lang="xml"><CharacterRemarks>
<Character name="April">Bubbly: I&apos;m &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O'Shanter">Burns: &quot;When chapman billies leave the street ...&quot;</Character>
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks></syntaxhighlight>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">use Data.XML;
use XMLCollection.Generic;
use Structure;
 
class Test {
bundle Default {
function : Main(args : String[]) ~ Nil {
class Test {
# list of name
function : Main(args : String[]) ~ Nil {
names := Vector->New()<String>;
# list of name
names := Vector->NewAddBack("April");
names->AddBack("AprilTam O'Shanter"->As(Base));
names->AddBack("Tam O'ShanterEmily"->As(Base));
# list of comments
names->AddBack("Emily"->As(Base));
comments := Vector->New()<String>;
# list of comments
comments->AddBack("Bubbly: I'm > Tam and <= Emily");
comments := Vector->New();
comments->AddBack("BubblyBurns: I'm\"When >chapman Tambillies andleave <=the Emilystreet ...\""->As(Base));
comments->AddBack(XmlElement->EncodeString("Burns:Short \"When& chapman billies leave the street ...\shrift""->As(Base));
# build XML document
comments->AddBack("Short & shrift"->As(Base));
builder := XmlBuilder->New("CharacterRemarks");
# build XML document
builderroot := XMLBuilderbuilder->NewGetRoot("CharacterRemarks");
if(names->Size() root := buildercomments->GetRootSize();) {
ifeach(names->Size()i =: comments->Size()names) {
element := XmlElement->New(XmlElement->Type->ELEMENT, "Character");
each(i : names) {
element := XMLElement->NewAddAttribute(XMLElementTypeXmlAttribute->ELEMENTNew("name", names->Get(i)));
element->SetContent(XmlElement->EncodeString(comments->Get(i)));
names->Get(i)->As(String),
commentsroot->GetAddChild(i)->As(String)element);
root->AddChild(element)};
};
builder->ToString()->PrintLine();
};
XMLElement->DecodeString(builder->ToString())->PrintLine();
}
}
}
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
Line 1,170 ⟶ 2,305:
from the toplevel using the library [http://tech.motion-twin.com/xmllight.html xml-light]:
 
<langsyntaxhighlight lang="ocaml"># #directory "+xml-light" (* or maybe "+site-lib/xml-light" *) ;;
 
# #load "xml-light.cma" ;;
Line 1,192 ⟶ 2,327:
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks>
- : unit = ()</langsyntaxhighlight>
 
Another solution using the library [http://erratique.ch/software/xmlm xmlm]:
 
<langsyntaxhighlight lang="ocaml">#directory "+xmlm"
#load "xmlm.cmo"
open Xmlm
Line 1,217 ⟶ 2,352:
) datas;
output xo (`El_end);
print_newline()</langsyntaxhighlight>
 
=={{header|Oz}}==
It is natural to represent XML document as nested Oz records. Writing a function that serializes records to textual XML is not too difficult.
 
<langsyntaxhighlight lang="oz">declare
proc {Main}
Names = ["April"
Line 1,310 ⟶ 2,445:
end
in
{Main}</langsyntaxhighlight>
 
Output:
<langsyntaxhighlight lang="xml"><?xml version="1.0" ?>
<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></langsyntaxhighlight>
 
=={{header|Perl}}==
{{libheader|XML::Mini}}
<langsyntaxhighlight lang="perl">#! /usr/bin/perl
use strict;
use XML::Mini::Document;
Line 1,340 ⟶ 2,475:
$stud->text($s->[1]);
}
print $doc->toString();</langsyntaxhighlight>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">constant</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">hchars</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hsubs</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">({{</span><span style="color: #008000;">"&lt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&amp;lt;"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&amp;gt;"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"&"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&amp;amp;"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"\""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&amp;quot;"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"\'"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&amp;apos;"</span><span style="color: #0000FF;">}})</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">xmlquote_all</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute_all</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">hchars</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hsubs</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">xml_CharacterRemarks</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">data</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"&lt;CharacterRemarks&gt;\n"</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">data</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" &lt;CharacterName=\"%s\"&gt;%s&lt;/Character&gt;\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">xmlquote_all</span><span style="color: #0000FF;">(</span><span style="color: #000000;">data</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">&</span> <span style="color: #008000;">"&lt;/CharacterRemarks&gt;\n"</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">testset</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"April"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Bubbly: I'm &gt; Tam and &lt;= Emily"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"Tam O'Shanter"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Burns: \"When chapman billies leave the street ...\""</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"Emily"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Short & shrift"</span><span style="color: #0000FF;">}</span>
<span style="color: #0000FF;">}</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">xml_CharacterRemarks</span><span style="color: #0000FF;">(</span><span style="color: #000000;">testset</span><span style="color: #0000FF;">))</span>
<span style="color: #000080;font-style:italic;">-- Sample output:
-- &lt;CharacterRemarks&gt;
-- &lt;CharacterName="April"&gt;Bubbly: I&amp;apos;m &amp;gt; Tam and &amp;lt;= Emily&lt;/Character&gt;
-- &lt;CharacterName="Tam O&amp;apos;Shanter"&gt;Burns: &amp;quot;When chapman billies leave the street ...&amp;quot;&lt;/Character&gt;
-- &lt;CharacterName="Emily"&gt;Short &amp;amp; shrift&lt;/Character&gt;
-- &lt;/CharacterRemarks&gt;</span>
<!--</syntaxhighlight>-->
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(load "@lib/xmxml.l")
 
(de characterRemarks (Names Remarks)
Line 1,361 ⟶ 2,534:
"I'm > Tam and <= Emily"
"Burns: \"When chapman billies leave the street ..."
"Short & shrift" ) )</langsyntaxhighlight>
Output:
<pre><CharacterRemarks>
<Character name="April">I'm > Tam and &amp;#60;= Emily</Character>
<Character name="Tam O'Shanter">Burns: &amp;#34;When chapman billies leave the ststreet ...</Character>
<Character name="Emily">Short &amp;#38; shrift</Character>
</CharacterRemarks></pre>
 
=={{header|PureBasic}}==
<syntaxhighlight lang="purebasic">DataSection
input lines are in separate files names.txt and remarks.txt. Output-XML is written to file demo.xml .
dataItemCount:
<lang Purebasic>
Data.i 3
names:
Data.s "April", "Tam O'Shanter", "Emily"
remarks:
Data.s "Bubbly: I'm > Tam and <= Emily",
~"Burns: \"When chapman billies leave the street ...\"",
"Short & shrift"
EndDataSection
 
Structure characteristic
name.s
remark.s
EndStructure
 
NewList didel.characteristic()
Define item.s, numberOfItems, i
If ReadFile(0, GetCurrentDirectory()+"names.txt")
 
While Eof(0) = 0
Restore dataItemCount
AddElement(didel())
Read.i numberOfItems
didel()\name = ReadString(0)
 
Wend
;add names
CloseFile(0)
Restore names
EndIf
For i = 1 To numberOfItems
AddElement(didel())
Read.s item
didel()\name = item
Next
 
;add remarks
ResetList(didel())
FirstElement(didel())
Restore remarks:
If ReadFile(0, GetCurrentDirectory()+"remarks.txt")
For i = 1 To numberOfItems
While Eof(0) = 0
Read.s item
didel()\remark = ReadString(0)
NextElement(didel())\remark = item
NextElement(didel())
Wend
Next
CloseFile(0)
 
EndIf
Define xml, mainNode, itemNode
ResetList(didel())
FirstElement(didel())
xml = CreateXML(#PB_Any)
mainNode = CreateXMLNode(RootXMLNode(xml), "CharacterRemarks")
ForEach didel()
SetXMLNodeName(mainNode, "CharacterRemarks")
itemNode = CreateXMLNode(mainNode, "Character")
ForEach didel()
SetXMLAttribute(itemNode, "name", didel()\name)
item = CreateXMLNode(mainNode)
SetXMLNodeText(itemNode, didel()\remark)
SetXMLNodeName(item, "Character")
Next
SetXMLAttribute(item, "name", didel()\name)
FormatXML(xml, #PB_XML_ReFormat | #PB_XML_WindowsNewline | #PB_XML_ReIndent)
SetXMLNodeText(item, didel()\remark)
Next
FormatXML(xml, #PB_XML_ReFormat | #PB_XML_WindowsNewline | #PB_XML_ReIndent)
SaveXML(xml, "demo.xml")
 
If OpenConsole()
</lang>
PrintN(ComposeXML(xml, #PB_XML_NoDeclaration))
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf</syntaxhighlight>
Sample output:
<pre><CharacterRemarks>
<Character name="April">Bubbly: I'm &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O&apos;Shanter">Burns: "When chapman billies leave the st
reet ..."</Character>
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks>
</pre>
 
=={{header|Python}}==
Normal output is all one line of XML, the .replace(...) makes it more readable.
<langsyntaxhighlight lang="python">>>> from xml.etree import ElementTree as ET
>>> from itertools import izip
>>> def characterstoxml(names, remarks):
Line 1,424 ⟶ 2,626:
remarks = [ "Bubbly: I'm > Tam and <= Emily",
'Burns: "When chapman billies leave the street ..."',
'Short & shrift' ] ).replace('><','>\n<')</langsyntaxhighlight>
Gives the output:
<langsyntaxhighlight lang="xml"><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></langsyntaxhighlight>
 
=={{header|R}}==
{{libheader|XML}}
<langsyntaxhighlight Rlang="r">library(XML)
char2xml <- function(names, remarks){
tt <- xmlHashTree()
Line 1,446 ⟶ 2,648:
}
output <- char2xml( names=c("April","Tam O'Shanter","Emily"),
remarks=c("Bubbly: I'm > Tam and <= Emily", 'Burns: "When chapman billies leave the street ..."', "Short & shrift") )</langsyntaxhighlight>
 
Gives the output: <!-- manually inserted "&amp;" where required to protect actual R output from the browser -->
Line 1,457 ⟶ 2,659:
=={{header|Racket}}==
 
<langsyntaxhighlight lang="racket">
#lang racket
(require xml)
Line 1,474 ⟶ 2,676:
"Burns: \"When chapman billies leave the street ...\""
"Short & shrift"))))
</syntaxhighlight>
</lang>
 
Output:
 
<langsyntaxhighlight lang="xml">
<CharacterRemarks>
<Character name="April">
Line 1,490 ⟶ 2,692:
</Character>
</CharacterRemarks>
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.05}}
 
<syntaxhighlight lang="raku" line>use XML::Writer;
 
my @students =
[ Q[April], Q[Bubbly: I'm > Tam and <= Emily] ],
[ Q[Tam O'Shanter], Q[Burns: "When chapman billies leave the street ..."] ],
[ Q[Emily], Q[Short & shrift] ]
;
 
my @lines = map { :Character[:name(.[0]), .[1]] }, @students;
 
say XML::Writer.serialize( CharacterRemarks => @lines );</syntaxhighlight>
{{out}}
<syntaxhighlight lang="xml"><CharacterRemarks><Character name="April">Bubbly: I'm &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O'Shanter">Burns: &quot;When chapman billies leave the street ...&quot;</Character>
<Character name="Emily">Short &amp; shrift</Character></CharacterRemarks></syntaxhighlight>
 
=={{header|Rascal}}==
<langsyntaxhighlight lang="rascal">import Prelude;
import lang::xml::DOM;
 
Line 1,508 ⟶ 2,730:
return println(xmlPretty(x));
}
}</langsyntaxhighlight>
This gives an output:
<langsyntaxhighlight lang="rascal">rascal>xmloutput(charnames, remarks)
<?xml version="1.0" encoding="UTF-8"?>
<CharacterRemarks>
Line 1,519 ⟶ 2,741:
 
 
ok</langsyntaxhighlight>
 
=={{header|REXX}}==
REXX doesn't have any functions to handle XML entities, an abbreviated version is included here.
<langsyntaxhighlight lang="rexx">/*REXX program tocreates createan aHTML (XML) list of character names &and corresponding remarks. */
charname. =
charname.1 = "April"
charname.2 = "Tam O'Shanter"
charname.3 = "Emily"
do i=1 while charname.i\==''
say 'charname' i '=' charname.i
end /*i*/; say
remark. =
remark.1 = "I'm > Tam and <= Emily"
remark.2 = "When chapman billies leave the street ..."
remark.3 = "Short & shift"
do k=1 while remark.k\==''
say ' remark' k '=' remark.k
end /*k*/; say
items = 0
header = 'CharacterRemarks'
header = header'>'
 
do j=1 while charname.j\==''
_=charname.j
if j==1 then call create '<'header
call create ' <Character name="' ||,
char2xml(_)'">"' ||,
char2xml(remark.j)'"</Character>'
end /*j*/
 
if create.0\==0 then call create '</'header
 
do m=1 for create.0
say create.m /*display the Mth entry to terminal. */
end /*m*/
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
/*──────────────────────────────────CREATE subroutine───────────────────*/
char2xml: procedure; parse arg $
create: items=items+1 /*bump the count of items in list*/
create.items amper =arg pos(1'&', $)\==0 /* & /*add itemhas to thebe treated special. CREATE list. */
create.0=items semi = pos(';', $)\==0 /*indicate how many; " " " " " items in list*/
#=0 /* [↓] find a free/unused character···*/
return
if amper then do /* ··· and translate freely. */
/*──────────────────────────────────XML_ subroutine─────────────────────*/
xml_: parse arg _ /*make an XMLdo entityj=0 for 255; ?=d2c(&xxxxj); if pos(?, $)==0 then */leave
end /*j*/
if pos(_,x)\==0 then return changestr(_,x,"&"arg(2)";")
$=translate($, ?, "&"); #= j + 1
return x
end
/*──────────────────────────────────CHAR2XML subroutine─────────────────*/
/* [↓] find a free/unused character···*/
char2xml: procedure; parse arg x
a=pos('&',x)\==0 if semi then do /*ampersands have to be treated special ··· and translate freely. */
do k=# for 255; ?=d2c(k); if pos(?, $)==0 then leave
b=pos(';',x)\==0 /*semicolons have to be treated special.*/
end /*k*/
xml0=0
$=translate($, ?, ";")
end
 
/*───── Following are most of the characters in the DOS (or DOS Windows) codepage 437 ──────────*/
if a\==0 then do
a=1 /*below, find a free character to translate freely.*/
do j=0 to 254; ?=d2c(j); if pos(?,x)==0 then leave; end
x=translate(x,?,"&");xml0=j+1
end
 
$=XML_('â',"ETH") ; $=XML_('ƒ',"fnof") ; $=XML_('═',"boxH") ; $=XML_('♥',"hearts")
if b\==0 then do
$=XML_('â','#x00e2') ; $=XML_('á',"aacute"); $=XML_('╬',"boxVH") ; $=XML_('♦',"diams")
b=1 /*below, find a free character to translate freely.*/
$=XML_('â','#x00e9') ; $=XML_('á','#x00e1'); $=XML_('╧',"boxHu") ; $=XML_('♣',"clubs")
do j=xml0 to 254; ??=d2c(j); if pos(??,x)==0 then leave; end
$=XML_('ä',"auml") ; $=XML_('í',"iacute"); $=XML_('╨',"boxhU") ; $=XML_('♠',"spades")
x=translate(x,??,";")
$=XML_('ä','#x00e4') ; $=XML_('í','#x00ed'); $=XML_('╤',"boxHd") ; $=XML_('♂',"male")
end
$=XML_('à',"agrave") ; $=XML_('ó',"oacute"); $=XML_('╥',"boxhD") ; $=XML_('♀',"female")
/*Following are a few of the chars in */
$=XML_('à','#x00e0') ; $=XML_('ó','#x00f3'); $=XML_('╙',"boxUr") ; $=XML_('☼',"#x263c")
/*the DOS (DOS under Windows) codepage.*/
$=XML_('å',"aring") ; $=XML_('ú',"uacute"); $=XML_('╘',"boxuR") ; $=XML_('↕',"UpDownArrow")
$=XML_('å','#x00e5') ; $=XML_('ú','#x00fa'); $=XML_('╒',"boxdR") ; $=XML_('¶',"para")
$=XML_('ç',"ccedil") ; $=XML_('ñ',"ntilde"); $=XML_('╓',"boxDr") ; $=XML_('§',"sect")
$=XML_('ç','#x00e7') ; $=XML_('ñ','#x00f1'); $=XML_('╫',"boxVh") ; $=XML_('↑',"uarr")
$=XML_('ê',"ecirc") ; $=XML_('Ñ',"Ntilde"); $=XML_('╪',"boxvH") ; $=XML_('↑',"uparrow")
$=XML_('ê','#x00ea') ; $=XML_('Ñ','#x00d1'); $=XML_('┘',"boxul") ; $=XML_('↑',"ShortUpArrow")
$=XML_('ë',"euml") ; $=XML_('¿',"iquest"); $=XML_('┌',"boxdr") ; $=XML_('↓',"darr")
$=XML_('ë','#x00eb') ; $=XML_('⌐',"bnot") ; $=XML_('█',"block") ; $=XML_('↓',"downarrow")
$=XML_('è',"egrave") ; $=XML_('¬',"not") ; $=XML_('▄',"lhblk") ; $=XML_('↓',"ShortDownArrow")
$=XML_('è','#x00e8') ; $=XML_('½',"frac12"); $=XML_('▀',"uhblk") ; $=XML_('←',"larr")
$=XML_('ï',"iuml") ; $=XML_('½',"half") ; $=XML_('α',"alpha") ; $=XML_('←',"leftarrow")
$=XML_('ï','#x00ef') ; $=XML_('¼',"frac14"); $=XML_('ß',"beta") ; $=XML_('←',"ShortLeftArrow")
$=XML_('î',"icirc") ; $=XML_('¡',"iexcl") ; $=XML_('ß',"szlig") ; $=XML_('1c'x,"rarr")
$=XML_('î','#x00ee') ; $=XML_('«',"laqru") ; $=XML_('ß','#x00df') ; $=XML_('1c'x,"rightarrow")
$=XML_('ì',"igrave") ; $=XML_('»',"raqru") ; $=XML_('Γ',"Gamma") ; $=XML_('1c'x,"ShortRightArrow")
$=XML_('ì','#x00ec') ; $=XML_('░',"blk12") ; $=XML_('π',"pi") ; $=XML_('!',"excl")
$=XML_('Ä',"Auml") ; $=XML_('▒',"blk14") ; $=XML_('Σ',"Sigma") ; $=XML_('"',"apos")
$=XML_('Ä','#x00c4') ; $=XML_('▓',"blk34") ; $=XML_('σ',"sigma") ; $=XML_('$',"dollar")
$=XML_('Å',"Aring") ; $=XML_('│',"boxv") ; $=XML_('µ',"mu") ; $=XML_("'","quot")
$=XML_('Å','#x00c5') ; $=XML_('┤',"boxvl") ; $=XML_('τ',"tau") ; $=XML_('*',"ast")
$=XML_('É',"Eacute") ; $=XML_('╡',"boxvL") ; $=XML_('Φ',"phi") ; $=XML_('/',"sol")
$=XML_('É','#x00c9') ; $=XML_('╢',"boxVl") ; $=XML_('Θ',"Theta") ; $=XML_(':',"colon")
$=XML_('æ',"aelig") ; $=XML_('╖',"boxDl") ; $=XML_('δ',"delta") ; $=XML_('<',"lt")
$=XML_('æ','#x00e6') ; $=XML_('╕',"boxdL") ; $=XML_('∞',"infin") ; $=XML_('=',"equals")
$=XML_('Æ',"AElig") ; $=XML_('╣',"boxVL") ; $=XML_('φ',"Phi") ; $=XML_('>',"gt")
$=XML_('Æ','#x00c6') ; $=XML_('║',"boxV") ; $=XML_('ε',"epsilon") ; $=XML_('?',"quest")
$=XML_('ô',"ocirc") ; $=XML_('╗',"boxDL") ; $=XML_('∩',"cap") ; $=XML_('_',"commat")
$=XML_('ô','#x00f4') ; $=XML_('╝',"boxUL") ; $=XML_('≡',"equiv") ; $=XML_('[',"lbrack")
$=XML_('ö',"ouml") ; $=XML_('╜',"boxUl") ; $=XML_('±',"plusmn") ; $=XML_('\',"bsol")
$=XML_('ö','#x00f6') ; $=XML_('╛',"boxuL") ; $=XML_('±',"pm") ; $=XML_(']',"rbrack")
$=XML_('ò',"ograve") ; $=XML_('┐',"boxdl") ; $=XML_('±',"PlusMinus") ; $=XML_('^',"Hat")
$=XML_('ò','#x00f2') ; $=XML_('└',"boxur") ; $=XML_('≥',"ge") ; $=XML_('`',"grave")
$=XML_('û',"ucirc") ; $=XML_('┴',"bottom"); $=XML_('≤',"le") ; $=XML_('{',"lbrace")
$=XML_('û','#x00fb') ; $=XML_('┴',"boxhu") ; $=XML_('÷',"div") ; $=XML_('{',"lcub")
$=XML_('ù',"ugrave") ; $=XML_('┬',"boxhd") ; $=XML_('÷',"divide") ; $=XML_('|',"vert")
$=XML_('ù','#x00f9') ; $=XML_('├',"boxvr") ; $=XML_('≈',"approx") ; $=XML_('|',"verbar")
$=XML_('ÿ',"yuml") ; $=XML_('─',"boxh") ; $=XML_('∙',"bull") ; $=XML_('}',"rbrace")
$=XML_('ÿ','#x00ff') ; $=XML_('┼',"boxvh") ; $=XML_('°',"deg") ; $=XML_('}',"rcub")
$=XML_('Ö',"Ouml") ; $=XML_('╞',"boxvR") ; $=XML_('·',"middot") ; $=XML_('Ç',"Ccedil")
$=XML_('Ö','#x00d6') ; $=XML_('╟',"boxVr") ; $=XML_('·',"middledot") ; $=XML_('Ç','#x00c7')
$=XML_('Ü',"Uuml") ; $=XML_('╚',"boxUR") ; $=XML_('·',"centerdot") ; $=XML_('ü',"uuml")
$=XML_('Ü','#x00dc') ; $=XML_('╔',"boxDR") ; $=XML_('·',"CenterDot") ; $=XML_('ü','#x00fc')
$=XML_('¢',"cent") ; $=XML_('╩',"boxHU") ; $=XML_('√',"radic") ; $=XML_('é',"eacute")
$=XML_('£',"pound") ; $=XML_('╦',"boxHD") ; $=XML_('²',"sup2") ; $=XML_('é','#x00e9')
$=XML_('¥',"yen") ; $=XML_('╠',"boxVR") ; $=XML_('■',"square ") ; $=XML_('â',"acirc")
 
if amper then $=xml_(?, "amp") /*Was there an ampersand? Translate it*/
x=XML_('♥',"hearts") ; x=XML_('â',"ETH") ; x=XML_('ƒ',"fnof") ; x=XML_('═',"boxH")
if semi then $=xml_(??, "semi") /* " " " semicolon? " "*/
x=XML_('♦',"diams") ; x=XML_('â','#x00e2') ; x=XML_('á',"aacute"); x=XML_('╬',"boxVH")
return $
x=XML_('♣',"clubs") ; x=XML_('â','#x00e9') ; x=XML_('á','#x00e1'); x=XML_('╧',"boxHu")
/*──────────────────────────────────────────────────────────────────────────────────────*/
x=XML_('♠',"spades") ; x=XML_('ä',"auml") ; x=XML_('í',"iacute"); x=XML_('╨',"boxhU")
create: items= items + 1 /*bump the count of items in the list. */
x=XML_('♂',"male") ; x=XML_('ä','#x00e4') ; x=XML_('í','#x00ed'); x=XML_('╤',"boxHd")
create.items= arg(1) /*add item to the CREATE list. */
x=XML_('♀',"female") ; x=XML_('à',"agrave") ; x=XML_('ó',"oacute"); x=XML_('╥',"boxhD")
create.0 = items /*indicate how many items in the list. */
x=XML_('☼',"#x263c") ; x=XML_('à','#x00e0') ; x=XML_('ó','#x00f3'); x=XML_('╙',"boxUr")
return
x=XML_('↕',"UpDownArrow") ; x=XML_('å',"aring") ; x=XML_('ú',"uacute"); x=XML_('╘',"boxuR")
/*──────────────────────────────────────────────────────────────────────────────────────*/
x=XML_('¶',"para") ; x=XML_('å','#x00e5') ; x=XML_('ú','#x00fa'); x=XML_('╒',"boxdR")
xml_: parse arg _ /*make an XML entity (&xxxx;) */
x=XML_('§',"sect") ; x=XML_('ç',"ccedil") ; x=XML_('ñ',"ntilde"); x=XML_('╓',"boxDr")
if pos(_, $)\==0 then return changestr(_, $, "&"arg(2)";")
x=XML_('↑',"uarr") ; x=XML_('ç','#x00e7') ; x=XML_('ñ','#x00f1'); x=XML_('╫',"boxVh")
return $</syntaxhighlight>
x=XML_('↑',"uparrow") ; x=XML_('ê',"ecirc") ; x=XML_('Ñ',"Ntilde"); x=XML_('╪',"boxvH")
Some older REXXes don't have a '''changestr''' bif, so one is included here &nbsp; ──► &nbsp; [[CHANGESTR.REX]].
x=XML_('↑',"ShortUpArrow") ; x=XML_('ê','#x00ea') ; x=XML_('Ñ','#x00d1'); x=XML_('┘',"boxul")
x=XML_('↓',"darr") ; x=XML_('ë',"euml") ; x=XML_('¿',"iquest"); x=XML_('┌',"boxdr")
x=XML_('↓',"downarrow") ; x=XML_('ë','#x00eb') ; x=XML_('⌐',"bnot") ; x=XML_('█',"block")
x=XML_('↓',"ShortDownArrow") ; x=XML_('è',"egrave") ; x=XML_('¬',"not") ; x=XML_('▄',"lhblk")
x=XML_('←',"larr") ; x=XML_('è','#x00e8') ; x=XML_('½',"frac12"); x=XML_('▀',"uhblk")
x=XML_('←',"leftarrow") ; x=XML_('ï',"iuml") ; x=XML_('½',"half") ; x=XML_('α',"alpha")
x=XML_('←',"ShortLeftArrow") ; x=XML_('ï','#x00ef') ; x=XML_('¼',"frac14"); x=XML_('ß',"beta")
x=XML_('1c'x,"rarr") ; x=XML_('î',"icirc") ; x=XML_('¡',"iexcl") ; x=XML_('ß',"szlig")
x=XML_('1c'x,"rightarrow") ; x=XML_('î','#x00ee') ; x=XML_('«',"laqru") ; x=XML_('ß','#x00df')
x=XML_('1c'x,"ShortRightArrow"); x=XML_('ì',"igrave") ; x=XML_('»',"raqru") ; x=XML_('Γ',"Gamma")
x=XML_('!',"excl") ; x=XML_('ì','#x00ec') ; x=XML_('░',"blk12") ; x=XML_('π',"pi")
x=XML_('"',"apos") ; x=XML_('Ä',"Auml") ; x=XML_('▒',"blk14") ; x=XML_('Σ',"Sigma")
x=XML_('$',"dollar") ; x=XML_('Ä','#x00c4') ; x=XML_('▓',"blk34") ; x=XML_('σ',"sigma")
x=XML_("'","quot") ; x=XML_('Å',"Aring") ; x=XML_('│',"boxv") ; x=XML_('µ',"mu")
x=XML_('*',"ast") ; x=XML_('Å','#x00c5') ; x=XML_('┤',"boxvl") ; x=XML_('τ',"tau")
x=XML_('/',"sol") ; x=XML_('É',"Eacute") ; x=XML_('╡',"boxvL") ; x=XML_('Φ',"phi")
x=XML_(':',"colon") ; x=XML_('É','#x00c9') ; x=XML_('╢',"boxVl") ; x=XML_('Θ',"Theta")
x=XML_('<',"lt") ; x=XML_('æ',"aelig") ; x=XML_('╖',"boxDl") ; x=XML_('δ',"delta")
x=XML_('=',"equals") ; x=XML_('æ','#x00e6') ; x=XML_('╕',"boxdL") ; x=XML_('∞',"infin")
x=XML_('>',"gt") ; x=XML_('Æ',"AElig") ; x=XML_('╣',"boxVL") ; x=XML_('φ',"Phi")
x=XML_('?',"quest") ; x=XML_('Æ','#x00c6') ; x=XML_('║',"boxV") ; x=XML_('ε',"epsilon")
x=XML_('@',"commat") ; x=XML_('ô',"ocirc") ; x=XML_('╗',"boxDL") ; x=XML_('∩',"cap")
x=XML_('[',"lbrack") ; x=XML_('ô','#x00f4') ; x=XML_('╝',"boxUL") ; x=XML_('≡',"equiv")
x=XML_('\',"bsol") ; x=XML_('ö',"ouml") ; x=XML_('╜',"boxUl") ; x=XML_('±',"plusmn")
x=XML_(']',"rbrack") ; x=XML_('ö','#x00f6') ; x=XML_('╛',"boxuL") ; x=XML_('±',"pm")
x=XML_('^',"Hat") ; x=XML_('ò',"ograve") ; x=XML_('┐',"boxdl") ; x=XML_('±',"PlusMinus")
x=XML_('`',"grave") ; x=XML_('ò','#x00f2') ; x=XML_('└',"boxur") ; x=XML_('≥',"ge")
x=XML_('{',"lbrace") ; x=XML_('û',"ucirc") ; x=XML_('┴',"bottom"); x=XML_('≤',"le")
x=XML_('{',"lcub") ; x=XML_('û','#x00fb') ; x=XML_('┴',"boxhu") ; x=XML_('÷',"div")
x=XML_('|',"vert") ; x=XML_('ù',"ugrave") ; x=XML_('┬',"boxhd") ; x=XML_('÷',"divide")
x=XML_('|',"verbar") ; x=XML_('ù','#x00f9') ; x=XML_('├',"boxvr") ; x=XML_('≈',"approx")
x=XML_('}',"rbrace") ; x=XML_('ÿ',"yuml") ; x=XML_('─',"boxh") ; x=XML_('∙',"bull")
x=XML_('}',"rcub") ; x=XML_('ÿ','#x00ff') ; x=XML_('┼',"boxvh") ; x=XML_('°',"deg")
x=XML_('Ç',"Ccedil") ; x=XML_('Ö',"Ouml") ; x=XML_('╞',"boxvR") ; x=XML_('·',"middot")
x=XML_('Ç','#x00c7') ; x=XML_('Ö','#x00d6') ; x=XML_('╟',"boxVr") ; x=XML_('·',"middledot")
x=XML_('ü',"uuml") ; x=XML_('Ü',"Uuml") ; x=XML_('╚',"boxUR") ; x=XML_('·',"centerdot")
x=XML_('ü','#x00fc') ; x=XML_('Ü','#x00dc') ; x=XML_('╔',"boxDR") ; x=XML_('·',"CenterDot")
x=XML_('é',"eacute") ; x=XML_('¢',"cent") ; x=XML_('╩',"boxHU") ; x=XML_('√',"radic")
x=XML_('é','#x00e9') ; x=XML_('£',"pound") ; x=XML_('╦',"boxHD") ; x=XML_('²',"sup2")
x=XML_('â',"acirc") ; x=XML_('¥',"yen") ; x=XML_('╠',"boxVR") ; x=XML_('■',"squart ")
 
{{out|output|text=&nbsp; (unrendered):
if a then x=xml_(?,"amp") /*if we had an ampersand, translate it now.*/
<pre>
if b then x=xml_(??,"semi") /*if we had a semicolon, translate it now.*/
return x</lang>
Some older REXXes don't have a '''changestr''' bif, so one is included here ──► [[CHANGESTR.REX]].
<br><br>
'''output'''
<pre style="overflow:scroll">
charname 1 = April
charname 2 = Tam O'Shanter
Line 1,662 ⟶ 2,883:
=={{header|Ruby}}==
The {{libheader|REXML}}library handles character mapping when adding attributes and text.
<langsyntaxhighlight lang="ruby">require 'rexml/document'
include REXML
 
Line 1,679 ⟶ 2,900:
 
# output with indentation
doc.write($stdout, 2)</langsyntaxhighlight>
 
produces <!-- manually inserted "&amp;" where required to protect actual Ruby output from the browser -->
Line 1,693 ⟶ 2,914:
</Character>
</CharacterRemarks></pre>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">extern crate xml;
 
use std::collections::HashMap;
use std::str;
 
use xml::writer::{EmitterConfig, XmlEvent};
 
fn characters_to_xml(characters: HashMap<String, String>) -> String {
let mut output: Vec<u8> = Vec::new();
let mut writer = EmitterConfig::new()
.perform_indent(true)
.create_writer(&mut output);
 
writer
.write(XmlEvent::start_element("CharacterRemarks"))
.unwrap();
 
for (character, line) in &characters {
let element = XmlEvent::start_element("Character").attr("name", character);
writer.write(element).unwrap();
writer.write(XmlEvent::characters(line)).unwrap();
writer.write(XmlEvent::end_element()).unwrap();
}
 
writer.write(XmlEvent::end_element()).unwrap();
str::from_utf8(&output).unwrap().to_string()
}
 
#[cfg(test)]
mod tests {
use super::characters_to_xml;
use std::collections::HashMap;
 
#[test]
fn test_xml_output() {
let mut input = HashMap::new();
input.insert(
"April".to_string(),
"Bubbly: I'm > Tam and <= Emily".to_string(),
);
input.insert(
"Tam O'Shanter".to_string(),
"Burns: \"When chapman billies leave the street ...\"".to_string(),
);
input.insert("Emily".to_string(), "Short & shrift".to_string());
 
let output = characters_to_xml(input);
 
println!("{}", output);
assert!(output.contains(
"<Character name=\"Tam O&apos;Shanter\">Burns: \"When chapman \
billies leave the street ...\"</Character>"
));
assert!(output
.contains("<Character name=\"April\">Bubbly: I'm > Tam and &lt;= Emily</Character>"));
assert!(output.contains("<Character name=\"Emily\">Short &amp; shrift</Character>"));
}
}</syntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">val names = List("April", "Tam O'Shanter", "Emily")
 
val remarks = List("Bubbly: I'm > Tam and <= Emily", """Burns: "When chapman billies leave the street ..."""", "Short & shrift")
Line 1,702 ⟶ 2,983:
{ names zip remarks map { case (name, remark) => <Character name={name}>{remark}</Character> } }
</CharacterRemarks>
 
 
characterRemarks(names, remarks)
</syntaxhighlight>
</lang>
 
Result:
<langsyntaxhighlight lang="xml"><CharacterRemarks>
<Character name="April">Bubbly: I'm &gt; Tam and &lt;= Emily</Character><Character name="Tam O'Shanter">Burns:
&quot;When chapman billies leave the street ...&quot;</Character><Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks></langsyntaxhighlight>
 
=={{header|SenseTalk}}==
<syntaxhighlight lang="sensetalk">put ("April", "Tam O'Shanter", "Emily") into names
put ("Bubbly: I'm > Tam and <= Emily", <<Burns: "When chapman billies leave the street ...">>, "Short & shrift") into remarks
put (_tag: "CharacterRemarks") as tree into document
repeat for each item name in names
insert (_tag: "Character", name: name, _children: item the counter of remarks) as tree into document's _children
end repeat
put document</syntaxhighlight>
 
{{out}}
<pre>
<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>
</pre>
 
=={{header|Sidef}}==
{{trans|Perl}}
<syntaxhighlight lang="ruby">require('XML::Mini::Document');
 
var students = [
["April", "Bubbly: I'm > Tam and <= Emily"],
["Tam O'Shanter", "Burns: \"When chapman billies leave the street ...\""],
["Emily", "Short & shrift"]
];
 
var doc = %s'XML::Mini::Document'.new;
var root = doc.getRoot;
var studs = root.createChild("CharacterRemarks");
 
students.each { |s|
var stud = studs.createChild("Character");
stud.attribute("name", s[0]);
stud.text(s[1]);
};
 
print doc.toString;</syntaxhighlight>
 
=={{header|Slate}}==
 
<langsyntaxhighlight lang="slate">lobby define: #remarks -> (
{'April' -> 'Bubbly: I\'m > Tam and <= Emily'.
'Tam O\'Shanter' -> 'Burns: "When chapman billies leave the street ..."'.
Line 1,728 ⟶ 3,048:
].
 
inform: writer contents</langsyntaxhighlight>
Produces:
<div style="width:full;overflow:scroll">
Line 1,737 ⟶ 3,057:
=={{header|Tcl}}==
===Using only Tcl string manipulation===
<langsyntaxhighlight Tcllang="tcl">proc xquote string {
list [string map "' &apos; \\\" &quot; < &gt; > &lt; & &amp;" $string]
}
Line 1,764 ⟶ 3,084:
append cmd " \[< Character {Name [xquote $name]} [xquote $comment]\]"
}
puts [eval $cmd]</langsyntaxhighlight>
produces<pre><CharacterRemarks><Character Name='April'>Bubbly: I&amp;apos;m &amp;lt; Tam and &amp;gt;= Emily</Character>
<Character Name='Tam O&amp;apos;Shanter'>Burns: &amp;quot;When chapman billies leave the street ...&amp;quot;</Character>
Line 1,771 ⟶ 3,091:
===Working with DOM trees===
Using {{libheader|tDOM}}
<langsyntaxhighlight lang="tcl">package require tdom
set xml [dom createDocument CharacterRemarks]
foreach {name comment} {
Line 1,783 ⟶ 3,103:
[$xml documentElement] appendChild $elem
}
$xml asXML</langsyntaxhighlight>
<pre><CharacterRemarks>
<Character name="April">Bubbly: I'm &amp;amp;gt; Tam and &amp;amp;lt;= Emily</Character>
Line 1,790 ⟶ 3,110:
</CharacterRemarks></pre>
Using {{libheader|TclXML}}
<langsyntaxhighlight lang="tcl">package require dom
set xml [dom::DOMImplementation create]
set root [dom::document createElement $xml CharacterRemarks]
Line 1,802 ⟶ 3,122:
dom::document createTextNode $element $comment
}
dom::DOMImplementation serialize $xml -indent 1</langsyntaxhighlight>
produces (with line breaks added for clarity:
<pre><?xml version="1.0"?>
Line 1,812 ⟶ 3,132:
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
STRUCTURE xmloutput
Line 1,834 ⟶ 3,154:
WRITE/NEXT d
ENDACCESS d
</syntaxhighlight>
</lang>
Output in file "dest":
<pre>
Line 1,843 ⟶ 3,163:
</CharacterRemarks>
</pre>
 
=={{header|VBScript}}==
Saves in a file.
<syntaxhighlight lang="vbscript}}">
Set objXMLDoc = CreateObject("msxml2.domdocument")
 
Set objRoot = objXMLDoc.createElement("CharacterRemarks")
objXMLDoc.appendChild objRoot
 
Call CreateNode("April","Bubbly: I'm > Tam and <= Emily")
Call CreateNode("Tam O'Shanter","Burns: ""When chapman billies leave the street ...""")
Call CreateNode("Emily","Short & shrift")
 
objXMLDoc.save("C:\Temp\Test.xml")
 
Function CreateNode(attrib_value,node_value)
Set objNode = objXMLDoc.createElement("Character")
objNode.setAttribute "name", attrib_value
objNode.text = node_value
objRoot.appendChild objNode
End Function
</syntaxhighlight>
 
=={{header|Vedit macro language}}==
The input data is given in an edit buffer, one name+remark pair on each line line, separated with TAB character.
<langsyntaxhighlight lang="vedit">// Replace special characters with entities:
Replace("&", "&amp;", BEGIN+ALL+NOERR) // this must be the first replace!
Replace("<", "&lt;", BEGIN+ALL+NOERR)
Line 1,863 ⟶ 3,205:
}
EOF
IT("</CharacterRemarks>") IN</langsyntaxhighlight>
 
Example input:
Line 1,882 ⟶ 3,224:
 
=={{header|Visual Basic .NET}}==
<langsyntaxhighlight lang="vbnet">Module XMLOutput
Sub Main()
Dim charRemarks As New Dictionary(Of String, String)
Line 1,895 ⟶ 3,237:
Console.WriteLine(xml)
End Sub
End Module</langsyntaxhighlight>
 
Output:
Line 1,905 ⟶ 3,247:
</CharacterRemarks>
</pre>
 
=={{header|Wren}}==
<syntaxhighlight lang="wren">var escapes = [
["&" , "&amp;"], // must do this one first
["\"", "&quot;"],
["'" , "&apos;"],
["<" , "&lt;"],
[">" , "&gt;"]
]
 
var xmlEscape = Fn.new { |s|
for (esc in escapes) s = s.replace(esc[0], esc[1])
return s
}
 
var xmlDoc = Fn.new { |names, remarks|
var xml = "<CharacterRemarks>\n"
for (i in 0...names.count) {
var name = xmlEscape.call(names[i])
var remark = xmlEscape.call(remarks[i])
xml = xml + " <Character name=\"%(name)\">%(remark)</Character>\n"
}
xml = xml + "</CharacterRemarks>"
System.print(xml)
}
 
var names = ["April", "Tam O'Shanter", "Emily"]
var remarks = [
"Bubbly: I'm > Tam and <= Emily",
"Burns: \"When chapman billies leave the street ...\"",
"Short & shrift"
]
xmlDoc.call(names, remarks)</syntaxhighlight>
 
{{out}}
<syntaxhighlight lang="xml"><CharacterRemarks>
<Character name="April">Bubbly: I&apos;m &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O&apos;Shanter">Burns: &quot;When chapman billies leave the street ...&quot;</Character>
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks></syntaxhighlight>
<br>
{{libheader|Wren-xsequence}}
Alternatively, using an XML library.
<syntaxhighlight lang="wren">import "./xsequence" for XDocument, XElement, XAttribute
 
var createXmlDoc = Fn.new { |names, remarks|
var root = XElement.new("CharacterRemarks")
for (i in 0...names.count) {
var xe = XElement.new("Character", remarks[i])
xe.add(XAttribute.new("name", names[i]))
root.add(xe)
}
return XDocument.new(root)
}
 
var names = ["April", "Tam O'Shanter", "Emily"]
var remarks = [
"Bubbly: I'm > Tam and <= Emily",
"Burns: \"When chapman billies leave the street ...\"",
"Short & shrift"
]
var doc = createXmlDoc.call(names, remarks)
System.print(doc)</syntaxhighlight>
{{out}}
Same as the first version but prefixed by:
<syntaxhighlight lang="xml"><?xml version="1.0" encoding="utf-8"?></syntaxhighlight>
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">code ChOut=8, CrLf=9, Text=12;
string 0; \use zero-terminated strings
 
Line 1,936 ⟶ 3,344:
];
Text(0, "</CharacterRemarks>"); CrLf(0);
]</langsyntaxhighlight>
 
{{out}}
Line 1,946 ⟶ 3,354:
</CharacterRemarks>
</pre>
 
=={{header|XQuery}}==
 
First, we create two string sequences (ordered lists), $names and $remarks, through which we then will loop, using a counter, $count, to keep the current iteration index, which we then will apply as XPath predicate to select an item at this index from the second sequence.
 
In the second variant we use a function 'fn:for-each-pair#3', instead of the FLOWR, to accomplish the same task. XML construction is being encapsulated within a callback function here.
 
Please note a single derivation from the requested task at the third item of the second list: I had to replace the ampersand (&) character with its XML entity, otherwise the input would have not been valid for the XQuery processor.
 
Variant #1-1: using a FLOWR expression and element constructors
 
<syntaxhighlight lang="xquery">
let $names := ("April","Tam O'Shanter","Emily")
let $remarks := ("Bubbly: I'm > Tam and <= Emily", 'Burns: "When chapman billies leave the street ..."',"Short &amp; shrift")
return element CharacterRemarks {
for $name at $count in $names
return element Character {
attribute name { $name }
,text { $remarks[$count] }
}
}
</syntaxhighlight>
 
Variant #1-2: using a FLOWR expression and literal XML
 
<syntaxhighlight lang="xquery">
let $names := ("April","Tam O'Shanter","Emily")
let $remarks := ("Bubbly: I'm > Tam and <= Emily", 'Burns: "When chapman billies leave the street ..."',"Short &amp; shrift")
return <CharacterRemarks>
{
for $name at $count in $names
return <Character name='{$name}'> {$remarks[$count]} </Character>
}
</CharacterRemarks>
</syntaxhighlight>
 
Variant #2-1: using a Higher Order Function and element constructors
 
<syntaxhighlight lang="xquery">
xquery version "3.1";
 
let $names := ("April","Tam O'Shanter","Emily")
let $remarks := ("Bubbly: I'm > Tam and <= Emily", 'Burns: "When chapman billies leave the street ..."',"Short &amp; shrift")
return element CharacterRemarks {
for-each-pair($names, $remarks, function($name, $remark) {
element Character {
attribute name { $name }
,text { $remark }
}
})
}
</syntaxhighlight>
 
Variant #2-2: using a Higher Order Function and literal XML expressions :)
 
<syntaxhighlight lang="xquery">
xquery version "3.1";
 
let $names := ("April","Tam O'Shanter","Emily")
let $remarks := ("Bubbly: I'm > Tam and <= Emily", 'Burns: "When chapman billies leave the street ..."',"Short &amp; shrift")
return <CharacterRemarks>
{
for-each-pair($names, $remarks, function($name, $remark) {
<Character name='{$name}'> {$remark} </Character>
})
}
</CharacterRemarks>
</syntaxhighlight>
 
Result for all variants:
 
<syntaxhighlight lang="xml">
<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>
</syntaxhighlight>
 
=={{header|Yabasic}}==
<syntaxhighlight lang="yabasic">sign$ = "<,&lt;,>,&gt;,&,&amp;"
dim sign$(1)
long = token(sign$, sign$(), ",")
 
sub substitute_all$(s$)
local i
for i = 1 to long step 2
if s$ = sign$(i) return sign$(i + 1)
next i
return s$
end sub
 
sub xmlquote_all$(s$)
local i, res$
for i = 1 to len(s$)
res$ = res$ + substitute_all$(mid$(s$, i, 1))
next i
return res$
end sub
sub xml_CharacterRemarks$(datos$())
local res$, i, long
long = arraysize(datos$(), 1)
res$ = "<CharacterRemarks>\n"
for i = 1 to long
res$ = res$ + " <CharacterName=\"" + xmlquote_all$(datos$(i, 1)) + "\">" + xmlquote_all$(datos$(i, 2)) + "</Character>\n"
next i
return res$ + "</CharacterRemarks>\n"
end sub
 
data "April", "Bubbly: I'm > Tam and <= Emily"
data "Tam O'Shanter", "Burns: \"When chapman billies leave the street ...\""
data "Emily", "Short & shrift"
 
dim testset$(3, 2)
 
for i = 1 to 3
read testset$(i, 1), testset$(i, 2)
next i
 
print xml_CharacterRemarks$(testset$())</syntaxhighlight>
 
=={{header|zkl}}==
<syntaxhighlight lang="zkl">fcn xmlEscape(text){
text.replace(" &"," &amp;") .replace(" \""," &quot;")
.replace(" '"," &apos;") .replace(" <"," &lt;") .replace(" >"," &gt;")
}
fcn toXML(as,bs){
xml:=Sink("<CharacterRemarks>\n");
as.zipWith('wrap(a,b){
xml.write(" <Character name=\"",xmlEscape(a),"\">",
xmlEscape(b),"</Character>\n");
},bs);
xml.write("</CharacterRemarks>\n").close();
}
 
toXML(T("April", "Tam O'Shanter", "Emily"),
T("Bubbly: I'm > Tam and <= Emily",
0'|Burns: "When chapman billies leave the street ..."|,
"Short & shrift"))
.print();</syntaxhighlight>
{{out}}
<pre>
<CharacterRemarks>
<Character name="April">Bubbly: I'm &gt; Tam and &lt;= Emily</Character>
<Character name="Tam O'Shanter">Burns: &quot;When chapman billies leave the street ..."</Character>
<Character name="Emily">Short &amp; shrift</Character>
</CharacterRemarks>
</pre>
 
 
 
{{omit from|Batch File|No way of XML parsing or processing.}}
9,485

edits