XML/DOM serialization: Difference between revisions

Added FreeBASIC
(add task to ARM64 assembly Raspberry Pi)
(Added FreeBASIC)
 
(23 intermediate revisions by 11 users not shown)
Line 9:
</element>
</root>
 
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program createXml64.s */
Line 114 ⟶ 115:
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
</lang>
 
=={{header|ABAP}}==
<syntaxhighlight lang="abap">
<lang ABAP>
DATA: xml_string TYPE string.
 
Line 136 ⟶ 138:
 
cl_demo_output=>display_text( xml_string ).
</syntaxhighlight>
</lang>
 
Output:
Line 149 ⟶ 151:
Uses [http://libre.adacore.com/libre/tools/xmlada/ XML/Ada] from AdaCore.
 
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO.Text_Streams;
with DOM.Core.Documents;
with DOM.Core.Nodes;
Line 172 ⟶ 174:
N => My_Document,
Pretty_Print => True);
end Serialization;</langsyntaxhighlight>
 
It can be shortened a lot by adding "use" clauses and writing the creation functions into the declaration part.
Line 181 ⟶ 183:
<element>Some text here</element>
</root></pre>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program createXml.s */
Line 359 ⟶ 362:
bx lr @ return
</syntaxhighlight>
</lang>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">version = "1.0"
xmlheader := "<?xml version=" . version . "?>" . "<" . root . ">"
 
Line 396 ⟶ 400:
}
Return xml .= "</" . root%root0% . ">"
}</langsyntaxhighlight>
 
=={{header|Bracmat}}==
To produce the XML including all indentations, we can do this:
<langsyntaxhighlight lang="bracmat">( ("?"."xml version=\"1.0\" ")
\n
(root.,"\n " (element.,"
Line 407 ⟶ 411:
: ?xml
& out$(toML$!xml)
);</langsyntaxhighlight>
If we do not care about indentation:
<langsyntaxhighlight lang="bracmat">( ("?"."xml version=\"1.0\"") (root.,(element.,"Some text here"))
: ?xml
& out$(toML$!xml)
);</langsyntaxhighlight>
 
=={{header|C}}==
==={{libheader|libxmlLibXML}}===
<langsyntaxhighlight lang="c">#include <stdiolibxml/parser.h>
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int main()
{
const char **next;
int a;
FILE *outFile;
 
xmlDoc *doc = xmlNewDoc("1.0");
xmlNode *root = xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, root);
 
xmlNode *node = xmlNewNode(NULL, BAD_CAST "element");
xmlAddChild(node, xmlNewText(BAD_CAST "some text here"));
xmlAddChild(root, node);
 
outFile = fopenxmlSaveFile("myfile.xml", "w"doc);
xmlElemDump(outFile, doc, root);
fclose(outFile);
xmlFreeDoc(doc);
xmlCleanupParser();
}</syntaxhighlight>
 
return EXIT_SUCCESS;
==={{libheader|Gadget}}===
}</lang>
<p>Version 1 (48 allocs):</p>
<syntaxhighlight lang="c">
#include <gadget/gadget.h>
 
LIB_GADGET_START
 
Main
String XML, body;
Stack{
Store ( XML, Parser( "element", "","Some text here", NORMAL_TAG) );
Store ( XML, Parser( "root", "",XML, NORMAL_TAG) );
} Stack_off;
body = Multi_copy( body,"<?xml version=\"1.0\" ?>", XML, NULL);
Print "%s\n", body;
Free secure XML, body;
End
</syntaxhighlight>
<p>Version 2 (46 allocs):</p>
<syntaxhighlight lang="c">
#include <gadget/gadget.h>
 
LIB_GADGET_START
 
Main
String XML, body;
Get_fn_let( XML, Parser( "element", "","Some text here", NORMAL_TAG) );
Get_fn_let( XML, Parser( "root", "",XML, NORMAL_TAG) );
body = Multi_copy( body,"<?xml version=\"1.0\" ?>", XML, NULL);
Print "%s\n", body;
Free secure XML, body;
End
</syntaxhighlight>
<p>Version 3 (47 allocs):</p>
<syntaxhighlight lang="c">
#include <gadget/gadget.h>
 
LIB_GADGET_START
 
Main
String XML, body;
Stack{
Store ( XML, Parser( "root", "",
Parser( "element", "","Some text here", NORMAL_TAG),
NORMAL_TAG) );
} Stack_off;
body = Multi_copy( body,"<?xml version=\"1.0\" ?>", XML, NULL);
Print "%s\n", body;
Free secure XML, body;
End
</syntaxhighlight>
 
<p>Version 4 (50 allocs):</p>
<syntaxhighlight lang="c">
#include <gadget/gadget.h>
 
LIB_GADGET_START
 
Main
String body;
Stack{
Store ( body, Multi_copy( body,"<?xml version=\"1.0\" ?>",
Parser( "root", "", Parser( "element", "","Some text here",
NORMAL_TAG), NORMAL_TAG),
NULL) );
}
 
Print "%s\n", body;
Free secure body;
End
</syntaxhighlight>
{{out}}
<pre>
$ ./tests/RC_dom
<?xml version="1.0" ?><root><element>Some text here</element></root>
</pre>
 
=={{header|C sharp}}==
Serialization using the built-in System.Xml.Serialization library of .Net.
<langsyntaxhighlight lang="csharp">using System.Xml;
using System.Xml.Serialization;
[XmlRoot("root")]
Line 463 ⟶ 541:
}
//Output: <?xml version="1.0" encoding="utf-8"?><root><element>Some text here</element></root>
}</langsyntaxhighlight>
 
=={{header|C++}}==
{{libheader|LibXML}}
<syntaxhighlight lang="cpp">
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <utility>
#include <vector>
 
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlerror.h>
#include <libxml/xmlsave.h>
#include <libxml/xmlstring.h>
#include <libxml/xmlversion.h>
 
#ifndef LIBXML_TREE_ENABLED
# error libxml was not configured with DOM tree support
#endif
 
#ifndef LIBXML_OUTPUT_ENABLED
# error libxml was not configured with serialization support
#endif
 
// Because libxml2 is a C library, we need a couple things to make it work
// well with modern C++:
// 1) a ScopeGuard-like type to handle cleanup functions; and
// 2) an exception type that transforms the library's errors.
 
// ScopeGuard-like type to handle C library cleanup functions.
template <typename F>
class [[nodiscard]] scope_exit
{
public:
// C++20: Constructor can (and should) be [[nodiscard]].
/*[[nodiscard]]*/ constexpr explicit scope_exit(F&& f) :
f_{std::move(f)}
{}
 
~scope_exit()
{
f_();
}
 
// Non-copyable, non-movable.
scope_exit(scope_exit const&) = delete;
scope_exit(scope_exit&&) = delete;
auto operator=(scope_exit const&) -> scope_exit& = delete;
auto operator=(scope_exit&&) -> scope_exit& = delete;
 
private:
F f_;
};
 
// Exception that gets last libxml2 error.
class libxml_error : public std::runtime_error
{
public:
libxml_error() : libxml_error(std::string{}) {}
 
explicit libxml_error(std::string message) :
std::runtime_error{make_message_(std::move(message))}
{}
 
private:
static auto make_message_(std::string message) -> std::string
{
if (auto const last_error = ::xmlGetLastError(); last_error)
{
if (not message.empty())
message += ": ";
message += last_error->message;
}
 
return message;
}
};
 
auto add_text(::xmlNode* node, ::xmlChar const* content)
{
// Create a new text node with the desired content.
auto const text_node = ::xmlNewText(content);
if (not text_node)
throw libxml_error{"failed to create text node"};
 
// Try to add it to the node. If it succeeds, that node will take
// ownership of the text node. If it fails, we have to clean up the text
// node ourselves first, then we can throw.
if (auto const res = ::xmlAddChild(node, text_node); not res)
{
::xmlFreeNode(text_node);
throw libxml_error{"failed to add text node"};
}
return text_node;
}
 
auto main() -> int
{
// Set this to true if you don't want the XML declaration.
constexpr auto no_xml_declaration = false;
 
try
{
// Initialize libxml.
::xmlInitParser();
LIBXML_TEST_VERSION
auto const libxml_cleanup = scope_exit{[] { ::xmlCleanupParser(); }};
 
// Create a new document.
auto doc = ::xmlNewDoc(reinterpret_cast<::xmlChar const*>(u8"1.0"));
if (not doc)
throw libxml_error{"failed to create document"};
auto const doc_cleanup = scope_exit{[doc] { ::xmlFreeDoc(doc); }};
 
// Create the root element.
auto root = ::xmlNewNode(nullptr,
reinterpret_cast<::xmlChar const*>(u8"root"));
if (not root)
throw libxml_error{"failed to create root element"};
::xmlDocSetRootElement(doc, root); // doc now owns root
 
// Add whitespace. Unless you know the whitespace is not significant,
// you should do this manually, rather than relying on automatic
// indenting.
add_text(root, reinterpret_cast<::xmlChar const*>(u8"\n "));
 
// Add the child element.
if (auto const res = ::xmlNewTextChild(root, nullptr,
reinterpret_cast<::xmlChar const*>(u8"element"),
reinterpret_cast<::xmlChar const*>(
u8"\n Some text here\n "));
not res)
throw libxml_error{"failed to create child text element"};
 
// Add whitespace.
add_text(root, reinterpret_cast<::xmlChar const*>(u8"\n"));
 
// Output tree. Note that the output is UTF-8 in all cases. If you
// want something different, use xmlSaveFileEnc() or the second
// argument of xmlSaveDoc().
if constexpr (no_xml_declaration)
{
auto const save_context = ::xmlSaveToFilename("-", nullptr,
XML_SAVE_NO_DECL);
auto const save_context_cleanup = scope_exit{[save_context] {
::xmlSaveClose(save_context); }};
 
if (auto const res = ::xmlSaveDoc(save_context, doc); res == -1)
throw libxml_error{"failed to write tree to stdout"};
}
else
{
if (auto const res = ::xmlSaveFile("-", doc); res == -1)
throw libxml_error{"failed to write tree to stdout"};
}
}
catch (std::exception const& x)
{
std::cerr << "ERROR: " << x.what() << '\n';
return EXIT_FAILURE;
}
}
</syntaxhighlight>
 
=={{header|Caché ObjectScript}}==
Line 489 ⟶ 733:
{{libheader|clojure.data.xml}}
 
<langsyntaxhighlight lang="clojure">
(require '[clojure.data.xml :as xml])
 
Line 497 ⟶ 741:
(java.io.FileOutputStream. "/tmp/output.xml") "UTF-8")]
(xml/emit xml-example out-file))
</syntaxhighlight>
</lang>
 
{{out}}
Line 508 ⟶ 752:
Assuming that matching the whitespace in the problem description isn't necessary and that character encodings are permitted (see the [[Talk:DOM XML Serialization|talk page]]):
 
<langsyntaxhighlight lang="lisp">(let* ((doc (dom:create-document 'rune-dom:implementation nil nil nil))
(root (dom:create-element doc "root"))
(element (dom:create-element doc "element"))
Line 515 ⟶ 759:
(dom:append-child root element)
(dom:append-child doc root)
(dom:map-document (cxml:make-rod-sink) doc))</langsyntaxhighlight>
 
gives the following output:
Line 524 ⟶ 768:
Because <code>dom:append-child</code> returns the appended child, the same output can be produced while binding fewer variables:
 
<langsyntaxhighlight lang="lisp">(let ((doc (dom:create-document 'rune-dom:implementation nil nil nil)))
(dom:append-child
(dom:append-child
Line 530 ⟶ 774:
(dom:create-element doc "element"))
(dom:create-text-node doc "Some text here"))
(write-string (dom:map-document (cxml:make-rod-sink) doc)))</langsyntaxhighlight>
 
The prefix notation makes this hard to decipher, however, and so a final version uses an auxiliary <code>append-child*</code>:
 
<langsyntaxhighlight lang="lisp">(defun append-child* (parent &rest children)
(reduce 'dom:append-child children :initial-value parent))
 
Line 542 ⟶ 786:
(dom:create-element doc "element")
(dom:create-text-node doc "Some text here"))
(write-string (dom:map-document (cxml:make-rod-sink) doc)))</langsyntaxhighlight>
 
=={{header|D}}==
{{works with|D|2.011+}}
<langsyntaxhighlight lang="d">module xmltest ;
 
import std.stdio ;
Line 557 ⟶ 801:
writefln(doc) ;
// output: <?xml version="1.0"?><root><element>Some text here</element></root>
}</langsyntaxhighlight>
 
=={{header|E}}==
Line 563 ⟶ 807:
This makes use of XML libraries provided with Java.
 
<langsyntaxhighlight lang="e">def document := <unsafe:javax.xml.parsers.makeDocumentBuilderFactory> \
.newInstance() \
.newDocumentBuilder() \
Line 573 ⟶ 817:
element.appendChild(
document.createTextNode("Some text here"))
println(document.saveXML(root))</langsyntaxhighlight>
 
(On the use of <tt>&lt;unsafe></tt>: The class has not yet been reviewed for E safety, so <tt>&lt;import:...makeDocumentBuilderFactory></tt> is not yet allowed. The review would probably be straightforward.)
 
=={{header|FreeBASIC}}==
{{libheader|libxml2}}
<syntaxhighlight lang="vbnet">#include once "crt/stdio.bi"
#include once "crt/stdlib.bi"
#include once "libxml/tree.bi"
#include once "libxml/parser.bi"
 
'' Create a new document
Dim As xmlDocPtr doc = xmlNewDoc(Strptr("1.0"))
 
'' Create a root node
Dim As xmlNodePtr root_node = xmlNewNode(NULL, Strptr("root"))
 
'' Set the root node for the document
xmlDocSetRootElement(doc, root_node)
 
'' Create a new node
Dim As xmlNodePtr node = xmlNewNode(NULL, Strptr("element"))
 
'' Add some text to the node
xmlNodeSetContent(node, Strptr("Some text here"))
 
'' Add the new node to the root node
xmlAddChild(root_node, node)
 
'' Dump the document to stdout, it will be well formatted
xmlDocDump(stdout, doc)
 
'' Free the document
xmlFreeDoc(doc)
 
'' Free the global variables that may have been allocated by the parser
xmlCleanupParser()</syntaxhighlight>
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">open System.Xml
 
[<EntryPoint>]
Line 595 ⟶ 872:
xw.Formatting <- Formatting.Indented
xd.WriteContentTo(xw)
0</langsyntaxhighlight>
Output
<pre><?xml version="1.0"?>
Line 601 ⟶ 878:
<element>Some text here</element>
</root></pre>
 
=={{header|Factor}}==
<syntaxhighlight lang="factor">USING: xml.syntax xml.writer ;
 
<XML <root><element>Some text here</element></root> XML>
pprint-xml</syntaxhighlight>
{{out}}
<pre>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element>
Some text here
</element>
</root>
</pre>
 
Factor's XML syntax isn't just for parsing static XML. Since it supports interpolation (denoted by <code><-></code>) and plays nicely with sequences, it is easy to build up arbitrary trees:
<syntaxhighlight lang="factor">USING: sequences xml.syntax xml.writer ;
 
3 [XML <element>Some text here</element> XML] <repetition>
[XML <element2><element3>1.0</element3></element2> XML] append
<XML <root><-></root> XML>
pprint-xml</syntaxhighlight>
{{out}}
<pre style="height:60ex">
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element>
Some text here
</element>
<element>
Some text here
</element>
<element>
Some text here
</element>
<element2>
<element3>
1.0
</element3>
</element2>
</root>
</pre>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">
using xml
Line 622 ⟶ 942:
}
}
</syntaxhighlight>
</lang>
 
Output:
Line 634 ⟶ 954:
=={{header|Forth}}==
{{libheader|Forth Foundation Library}}
<langsyntaxhighlight lang="forth">include ffl/dom.fs
 
\ Create a dom variable 'doc' in the dictionary
Line 662 ⟶ 982:
doc dom-write-string [IF]
type cr
[THEN]</langsyntaxhighlight>
 
=={{header|Go}}==
{{libheader|bitbucketgitlab.orgcom/rjstone.code/xmldom-go.git}}
A very small, subset of the W3C DOM Core in Go. The work builds off the existing XML parser. A fork of the godom project (http://code.google.com/p/godom/), which appears to be unsupported at the moment.
A partial solution based on an incomplete library. The library is missing functions needed to create a DOM piece by piece like other other solutions here. It can however create a DOM by parsing XML. Also, it lacks a function to access the processing instruction, so not surprisingly this is missing from the serialized output.
 
<lang go>package main
<syntaxhighlight lang="go">package main
 
import (
"fmt"
dom "bitbucketgitlab.orgcom/rjstone.code/xmldom-go.git"
)
 
Line 687 ⟶ 1,008:
}
fmt.Println(string(d.ToXml()))
}</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight lang="xml"><root>
<element>
Some text here
</element>
</root></langsyntaxhighlight>
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">import groovy.xml.MarkupBuilder
def writer = new StringWriter() << '<?xml version="1.0" ?>\n'
def xml = new MarkupBuilder(writer)
Line 702 ⟶ 1,023:
element('Some text here' )
}
println writer</langsyntaxhighlight>
 
=={{header|Haskell}}==
Line 708 ⟶ 1,029:
Using the XML.Light module from [http://hackage.haskell.org/package/xml-1.3.4 HackageDB]
 
<langsyntaxhighlight Haskelllang="haskell">import Data.List
import Text.XML.Light
 
Line 721 ⟶ 1,042:
Nothing
]
Nothing</langsyntaxhighlight>
Output:
<pre>*Main> mapM_ (putStrLn.ppContent) $ parseXML (xmlDOM " Some text ")
Line 732 ⟶ 1,053:
There are probably better ways of doing this, but, here is a simple serializer for a rudimentary concept of a dom:
 
<langsyntaxhighlight lang="j">serialize=: ('<?xml version="1.0" ?>',LF),;@serialize1&''
serialize1=:4 :0
if.L.x do.
Line 742 ⟶ 1,063:
<y,x,LF
end.
)</langsyntaxhighlight>
 
And here is a document object that matches this task:
 
<langsyntaxhighlight lang="j">obj=: 'root';<'element';'some text here'</langsyntaxhighlight>
 
Example use:
 
<langsyntaxhighlight lang="xml"> serialize obj
<?xml version="1.0" ?>
<root>
Line 756 ⟶ 1,077:
some text here
</element>
</root></langsyntaxhighlight>
 
=={{header|Java}}==
[[Java|Java's]] XML DOM tools don't really allow total control of the output format "out of the box" but the following program generates XML that is equivalent to the required output.
<langsyntaxhighlight lang="java">
import java.io.StringWriter;
 
Line 866 ⟶ 1,187:
}
}
</syntaxhighlight>
</lang>
 
'''Output:'''
 
<langsyntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<element>Some text here</element>
</root></langsyntaxhighlight>
 
=={{header|JavaScript}}==
Line 879 ⟶ 1,200:
DOM
 
<langsyntaxhighlight lang="javascript">var doc = document.implementation.createDocument( null, 'root', null );
var root = doc.documentElement;
var element = doc.createElement( 'element' );
root.appendChild( element );
element.appendChild( document.createTextNode('Some text here') );
var xmlString = new XMLSerializer().serializeToString( doc );</langsyntaxhighlight>
 
E4X
 
<langsyntaxhighlight lang="javascript">var xml = <root>
<element>Some text here</element>
</root>;
var xmlString = xml.toXMLString();</langsyntaxhighlight>
 
E4X — with processing instruction
 
<langsyntaxhighlight lang="javascript">XML.ignoreProcessingInstructions = false;
var xml = <?xml version="1.0"?>
<root>
<element>Some text here</element>
</root>;
var xmlString = xml.toXMLString();</langsyntaxhighlight>
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">using LightXML
 
# Modified from the documentation for LightXML.jl. The underlying library requires an encoding string be printed.
Line 921 ⟶ 1,242:
println(xdoc)
 
</langsyntaxhighlight>{{output}}<pre>
<?xml version="1.0" encoding="utf-8"?>
<root>
Line 934 ⟶ 1,255:
 
So I've decided to leave it as it is.
<langsyntaxhighlight lang="scala">// version 1.1.3
 
import javax.xml.parsers.DocumentBuilderFactory
Line 964 ⟶ 1,285:
}
println(sw)
}</langsyntaxhighlight>
 
{{out}}
Line 975 ⟶ 1,296:
 
=={{header|Lasso}}==
<langsyntaxhighlight lang="lasso">
content_type( 'text/xml' );// set MIME type if serving
 
xml( '<?xml version="1.0" ?><root><element>Some text here</element></root>' );
 
</syntaxhighlight>
</lang>
 
=={{header|Lingo}}==
Code based on Flash Xtra (comes with Director, i.e. "built-in") that allows to use AS2/AS3 classes in Lingo (in this case "XML" is an AS2 class).
<langsyntaxhighlight lang="lingo">-- create an XML document
doc = newObject("XML", "<?xml version='1.0' ?>")
 
Line 997 ⟶ 1,318:
 
put doc.toString()
-- "<?xml version='1.0' ?><root><element>Some text here</element></root>"</langsyntaxhighlight>
 
=={{header|Lua}}==
Using the widely available 'LuaXML' module
<langsyntaxhighlight Lualang="lua">require("LuaXML")
local dom = xml.new("root")
local element = xml.new("element")
table.insert(element, "Some text here")
dom:append(element)
dom:save("dom.xml")</langsyntaxhighlight>
Resulting contents of dom.xml:
<pre><?xml version="1.0"?>
Line 1,015 ⟶ 1,336:
</root></pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">DOM = XMLObject["Document"][{XMLObject["Declaration"]["Version" -> "1.0","Encoding" -> "utf-8"]},
XMLElement["root", {}, {XMLElement["element", {}, {"Some text here"}]}], {}];
ExportString[DOM, "XML", "AttributeQuoting" -> "\""]</syntaxhighlight>
 
{{out}}
ExportString[DOM, "XML", "AttributeQuoting" -> "\""]</lang>
Output:
<pre><?xml version="1.0" encoding="utf-8"?>
<root>
Line 1,027 ⟶ 1,347:
 
=={{header|MATLAB}}==
<langsyntaxhighlight MATLABlang="matlab">docNode = com.mathworks.xml.XMLUtils.createDocument('root');
docRootNode = docNode.getDocumentElement;
thisElement = docNode.createElement('element');
thisElement.appendChild(docNode.createTextNode('Some text here'));
docRootNode.appendChild(thisElement);
</syntaxhighlight>
</lang>
Output:
<pre> xmlwrite(docNode)
Line 1,046 ⟶ 1,366:
=={{header|NetRexx}}==
{{trans|Java}}
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
Line 1,114 ⟶ 1,434:
 
return
</syntaxhighlight>
</lang>
 
'''Output:'''
 
<langsyntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<element>Some text here</element>
</root></langsyntaxhighlight>
 
=={{header|Nim}}==
<lang {{libheader|nim>import -xmldom}}
Note that the module “xmldom” is no longer part of the standard library as more convenient modules are now available. It can be installed using the package manager <code>nimble</code>.
<syntaxhighlight lang="nim">import xmldom
 
var
Line 1,136 ⟶ 1,458:
firstElement.appendChild textNode
 
echo document</langsyntaxhighlight>
Output:
<pre><?xml version="1.0" encoding="UTF-8" ?>
Line 1,146 ⟶ 1,468:
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">use XML;
 
bundle Default {
Line 1,158 ⟶ 1,480:
}
}
}</langsyntaxhighlight>
 
=={{header|OpenEdge/Progress}}==
The following example uses the X-DOCUMENT, for faster processing SAX can be used.
<langsyntaxhighlight lang="progress">
DEFINE VARIABLE hxdoc AS HANDLE NO-UNDO.
DEFINE VARIABLE hxroot AS HANDLE NO-UNDO.
Line 1,186 ⟶ 1,508:
hxdoc:SAVE( 'LONGCHAR', lcc ).
MESSAGE STRING( lcc ) VIEW-AS ALERT-BOX.
</syntaxhighlight>
</lang>
 
=={{header|Oz}}==
With the code from [[XML Creation#Oz]], we can write:
 
<langsyntaxhighlight lang="oz">declare
proc {Main}
DOM = root(element("Some text here"))
Line 1,197 ⟶ 1,519:
{System.showInfo {Serialize DOM}}
end
...</langsyntaxhighlight>
 
Output:
<langsyntaxhighlight lang="xml"><?xml version="1.0" ?>
<root>
<element>Some text here</element>
</root></langsyntaxhighlight>
 
=={{header|Pascal}}==
{{works with|Free_Pascal}} {{libheader|Classes}} {{libheader|XMLWrite}} {{libheader|DOM}}
<langsyntaxhighlight lang="pascal">program CrearXML;
 
{$mode objfpc}{$H+}
Line 1,228 ⟶ 1,550:
NodoRaiz.AppendChild(NodoPadre); // insertar el nodo hijo en el correspondiente nodo padre
writeXMLFile(xDoc,'prueba.xml'); // escribir el XML
NodoRaiz.free;
NodoPadre.free;
NodoHijo.free;
Xdoc.free;
end.</langsyntaxhighlight>
 
Output:<pre>
Line 1,241 ⟶ 1,566:
 
{{libheader|XML::Simple}}
<langsyntaxhighlight lang="perl">use XML::Simple;
print XMLout( { root => { element => "Some text here" } }, NoAttr => 1, RootName => "" );</langsyntaxhighlight>
 
'''Output''':
Line 1,250 ⟶ 1,575:
 
{{libheader|XML::DOM::BagOfTricks}}
<langsyntaxhighlight lang="perl">use XML::DOM::BagOfTricks qw(createDocument createTextElement);
 
my ($doc, $root) = createDocument('root');
Line 1,256 ⟶ 1,581:
createTextElement($doc, 'element', 'Some text here')
);
print $doc->toString;</langsyntaxhighlight>
 
'''Output''':
Line 1,262 ⟶ 1,587:
 
{{libheader|LibXML}}
<langsyntaxhighlight lang="perl">use XML::LibXML;
 
$xml = XML::LibXML::Document->new('1.0');
Line 1,273 ⟶ 1,598:
$node->addChild($node2);
 
print $xml->toString;</langsyntaxhighlight>
 
'''Output''':
<?xml version="1.0"?>
<root>text<element>Some text here</element></root>
 
=={{header|Perl 6}}==
{{works with|Rakudo|2018.05}}
 
<lang perl6>use XML;
use XML::Writer;
 
say my $document = XML::Document.new(
XML::Writer.serialize( :root[ :element['Some text here', ], ] )
);</lang>
{{out}}
<lang xml><?xml version="1.0"?><root><element>Some text here</element></root></lang>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>include builtins/xml.e
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
sequence elem = xml_new_element("element", "Some text here"),
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">/</span><span style="color: #000000;">xml</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
root = xml_new_element("root", {elem}),
<span style="color: #004080;">sequence</span> <span style="color: #000000;">elem</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xml_new_element</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"element"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Some text here"</span><span style="color: #0000FF;">),</span>
doc = xml_new_doc(root,{`<?xml version="1.0" ?>`})
<span style="color: #000000;">root</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xml_new_element</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"root"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">elem</span><span style="color: #0000FF;">}),</span>
puts(1,xml_sprint(doc))</lang>
<span style="color: #000000;">doc</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xml_new_doc</span><span style="color: #0000FF;">(</span><span style="color: #000000;">root</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">`&lt;?xml version="1.0" ?&gt;`</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">xml_sprint</span><span style="color: #0000FF;">(</span><span style="color: #000000;">doc</span><span style="color: #0000FF;">))</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 1,308 ⟶ 1,624:
=={{header|PHP}}==
{{works with|PHP|5}}
<langsyntaxhighlight lang="php"><?php
$dom = new DOMDocument();//the constructor also takes the version and char-encoding as it's two respective parameters
$dom->formatOutput = true;//format the outputted xml
Line 1,316 ⟶ 1,632:
$root->appendChild($element);
$dom->appendChild($root);
$xmlstring = $dom->saveXML();</langsyntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(load "@lib/xm.l")
 
(xml? T)
(xml '(root NIL (element NIL "Some text here")))</langsyntaxhighlight>
Output:
<pre><?xml version="1.0" encoding="utf-8"?>
Line 1,328 ⟶ 1,644:
<element>Some text here</element>
</root></pre>
 
=={{header|Pike}}==
manually, one node at a time:
<langsyntaxhighlight Pikelang="pike">object dom = Parser.XML.Tree.SimpleRootNode();
dom->add_child(Parser.XML.Tree.SimpleNode(Parser.XML.Tree.XML_HEADER, "", ([]), ""));
object node = Parser.XML.Tree.SimpleNode(Parser.XML.Tree.XML_ELEMENT, "root", ([]), "");
Line 1,343 ⟶ 1,660:
 
dom->render_xml();
Result: "<?xml version='1.0' encoding='utf-8'?><root><element>Some text here</element></root>"</langsyntaxhighlight>
 
from an array, using a conversion function:
<langsyntaxhighlight Pikelang="pike">object make_xml_node(array|string in, void|int level)
{
level++;
Line 1,372 ⟶ 1,689:
array input = ({ "root", ([]), ({ "element", ([]), "Some text here" }) });
make_xml_tree(input)->render_xml();
Result: "<?xml version='1.0' encoding='utf-8'?><root><element>Some text here</element></root>"</langsyntaxhighlight>
 
to render the output with indenting as specified in the task, this function adds the necessary text nodes:
<langsyntaxhighlight Pikelang="pike">object indent_xml(object parent, void|int indent_text, void|int level)
{
int subnodes = false;
Line 1,406 ⟶ 1,723:
" Some text here\r\n"
" </element>\r\n"
"</root>"</langsyntaxhighlight>
 
=={{header|Python}}==
{{works with|Python|2.5}}
<langsyntaxhighlight lang="python">from xml.dom.minidom import getDOMImplementation
 
dom = getDOMImplementation()
Line 1,421 ⟶ 1,738:
firstElement.appendChild(textNode)
 
xmlString = document.toprettyxml(" " * 4)</langsyntaxhighlight>
 
<langsyntaxhighlight lang="python">from xml.etree import ElementTree as et
 
root = et.Element("root")
et.SubElement(root, "element").text = "Some text here"
xmlString = et.tostring(root)</langsyntaxhighlight>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang at-exp racket
(require xml)
Line 1,447 ⟶ 1,764:
(write-xml xml)
(newline)
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.05}}
 
<syntaxhighlight lang="raku" line>use XML;
use XML::Writer;
 
say my $document = XML::Document.new(
XML::Writer.serialize( :root[ :element['Some text here', ], ] )
);</syntaxhighlight>
{{out}}
<syntaxhighlight lang="xml"><?xml version="1.0"?><root><element>Some text here</element></root></syntaxhighlight>
 
=={{header|Rascal}}==
<langsyntaxhighlight lang="rascal">import lang::xml::DOM;
 
public void main(){
x = document(element(none(), "root", [element(none(), "element", [charData("Some text here")])]));
return println(xmlPretty(x));
}</langsyntaxhighlight>
Output example:
<langsyntaxhighlight lang="rascal">rascal>main()
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element>Some text here</element>
</root></langsyntaxhighlight>
 
=={{header|Ruby}}==
{{libheader|REXML}}
<langsyntaxhighlight lang="ruby">require("rexml/document")
include REXML
(doc = Document.new) << XMLDecl.new
Line 1,476 ⟶ 1,806:
serialized = String.new
doc.write(serialized, 4)
puts serialized</langsyntaxhighlight>
 
produces
Line 1,487 ⟶ 1,817:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">val xml = <root><element>Some text here</element></root>
scala.xml.XML.save(filename="output.xml", node=xml, enc="UTF-8", xmlDecl=true, doctype=null)</langsyntaxhighlight>
 
=={{header|Sidef}}==
{{trans|Perl}}
<langsyntaxhighlight lang="ruby">require('XML::Simple');
print %S'XML::Simple'.XMLout(
:(root => :( element => 'Some text here' )),
NoAttr => 1, RootName => '',
);</langsyntaxhighlight>
{{out}}
<pre>
Line 1,506 ⟶ 1,836:
=={{header|Tcl}}==
{{libheader|tDOM}}
<langsyntaxhighlight lang="tcl">package require tdom
set d [dom createDocument root]
set root [$d documentElement]
$root appendChild [$d createElement element]
[$root firstChild] appendChild [$d createTextNode "Some text here"]
$d asXML</langsyntaxhighlight>
<pre><root>
<element>Some text here</element>
</root></pre>
Using [http://tclxml.sf.net TclDOM]
<langsyntaxhighlight lang="tcl">package require dom
set doc [dom::DOMImplementation create]
set root [dom::document createElement $doc root]
set elem [dom::document createElement $root element]
set text [dom::document createTextNode $elem "Some text here"]
dom::DOMImplementation serialize $doc -newline {element}</langsyntaxhighlight>
<pre><?xml version='1.0'?>
<!DOCTYPE root>
Line 1,529 ⟶ 1,859:
</element>
</root></pre>
 
=={{header|Wren}}==
Wren has no built-in or (AFAIK) third party support for XML so we code a minimal DOM sufficient for completing this task.
<syntaxhighlight lang="wren">class XmlDocument {
construct new(root) {
_root = root
}
 
toString { "<?xml version=\"1.0\" ?>\n%(_root.toString(0))" }
}
 
class XmlElement {
construct new(name, text) {
_name = name
_text = text
_children = []
}
 
name { _name }
text { _text }
children { _children }
 
addChild(child) { _children.add(child) }
 
toString(level) {
var indent = " "
var s = indent * level + "<%(name)>\n"
if (_text != "") s = s + indent * (level + 1) + _text + "\n"
for (c in _children) {
s = s + c.toString(level+1) + "\n"
}
return s + indent * level + "</%(name)>"
}
}
 
var root = XmlElement.new("root", "")
var child = XmlElement.new("element", "Some text here")
root.addChild(child)
var doc = XmlDocument.new(root)
System.print(doc)</syntaxhighlight>
 
{{out}}
<pre>
<?xml version="1.0" ?>
<root>
<element>
Some text here
</element>
</root>
</pre>
<br>
{{libheader|Wren-xsequence}}
Since the first version was written, the above XML parser has appeared and, consequently, the solution can now be rewritten as follows.
<syntaxhighlight lang="wren">import "./xsequence" for XDocument, XElement
 
var doc = XDocument.new(
XElement.new("root",
XElement.new("element", "Some text here")
)
)
System.print(doc)</syntaxhighlight>
{{out}}
<pre>
<?xml version="1.0" encoding="utf-8"?>
<root>
<element>Some text here</element>
</root>
</pre>
 
=={{header|XProc}}==
<langsyntaxhighlight lang="xml"><p:pipeline xmlns:p="http://www.w3.org/ns/xproc" version="1.0">
<p:identity>
<p:input port="source">
Line 1,543 ⟶ 1,941:
</p:input>
</p:identity>
</p:pipeline></langsyntaxhighlight>
 
=={{header|XQuery}}==
In XQuery static element construction is like normal XML:
<langsyntaxhighlight lang="xquery"><root>
<element>
Some text here
</element>
</root></langsyntaxhighlight>
 
Dynamic element construction looks quite different:
<langsyntaxhighlight lang="xquery">let $rootTagname := 'root'
let $elementTagname := 'element'
let $elementContent := 'Some text here'
Line 1,563 ⟶ 1,961:
element{$elementTagname}
{$elementContent}
}</langsyntaxhighlight>
 
=={{header|XSLT}}==
<langsyntaxhighlight lang="xml"><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/"> <!-- replace the root of the incoming document with our own model -->
Line 1,575 ⟶ 1,973:
</xsl:element>
</xsl:template>
</xsl:stylesheet></langsyntaxhighlight>
 
=={{header|Z80 Assembly}}==
Assembled and run using WinAPE's built-in assembler. Tags have to be manually opened and closed, but it works!
<syntaxhighlight lang="z80">org &1000
main:
ld hl,XML_Header
ld de,XMLRam
call strcpy
 
ld hl,XML_Root
push hl
call AddXMLNode
 
ld hl,XML_Element
push hl
call AddXMLNode
 
ld hl,XML_Entry
call strcpy
 
pop hl ;ld hl,XML_Element
call CloseXMLNode
 
pop hl ;ld hl,XML_Root
call CloseXMLNode
 
ld hl,XMLRam
jp PrintString ;and then return to basic.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AddXMLNode:
;hl = pointer to desired node name
;de = destination ram
;carry flag; set = <foo/>, clear = <foo></foo>
push af
ld a,'<'
ld (de),a
inc de
call strcpy
pop af
jr nc,skip_AddXMLNode
ld a,'/'
ld (de),a
inc de
skip_AddXMLNode:
ld a,'>'
ld (de),a
inc de
xor a
ld (de),a
;don't inc de afterwards, since we may want to add more
ret
 
CloseXMLNode:
ld a,'<'
ld (de),a
inc de
ld a,'/'
ld (de),a
inc de
call strcpy
ld a,'>'
ld (de),a
inc de
xor a
ld (de),a
ret
 
PrintString:
ld a,(hl)
or a
ret z
call &BB5A
inc hl
jr PrintString
 
strcpy:
;HL = string source
;DE = destination
;copies 1 byte at a time until a null terminator is copied, then exits.
ld a,(hl)
ld (de),a
or a
ret z
inc hl
inc de
jp strcpy
 
org &1200
XML_Header:
byte "<?xml version=",&22,"1.0",&22,"?>",0
XML_Root:
byte "root",0
XML_Element:
byte "element",0
XML_Entry:
byte "some text here",0
 
org &1300
XMLRam: ;this is where the output is stored.</syntaxhighlight>
 
{{out}}
<pre>call &1000
<?xml version="1.0"?><root><element>some text here</element></root></pre>
 
{{omit from|Batch File|No way of XML parsing or processing.}}
2,136

edits