On this page
std/xmltree
Source EditA simple XML tree generator.
Example:
import std/xmltree
var g = newElement("myTag")
g.add newText("some text")
g.add newComment("this is comment")
var h = newElement("secondTag")
h.add newEntity("some entity")
let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes
let k = newXmlTree("treeTag", [g, h], att)
doAssert $k == """<treeTag key1="first value" key2="second value">
<myTag>some text<!-- this is comment --></myTag>
<secondTag>&some entity;</secondTag>
</treeTag>"""
See also:
- xmlparser module for high-level XML parsing
- parsexml module for low-level XML parsing
- htmlgen module for html code generator
Imports
Types
-
XmlAttributes = StringTableRef
-
An alias for a string to string mapping.
Use toXmlAttributes proc to create
Source EditXmlAttributes
. -
XmlNode = ref XmlNodeObj
-
An XML tree consisting of XML nodes.
Use newXmlTree proc for creating a new tree.
Source Edit
Consts
Procs
-
proc add(father, son: XmlNode) {.inline, ...raises: [], tags: [], forbids: [].}
-
Adds the child
son
tofather
.father
must be ofxnElement
typeSee also:
Example:
Source Editvar f = newElement("myTag") f.add newText("my text") f.add newElement("sonTag") f.add newEntity("my entity") assert $f == "<myTag>my text<sonTag />&my entity;</myTag>"
-
proc add(father: XmlNode; sons: openArray[XmlNode]) {.inline, ...raises: [], tags: [], forbids: [].}
-
Adds the children
sons
tofather
.father
must be ofxnElement
typeSee also:
Example:
Source Editvar f = newElement("myTag") f.add(@[newText("my text"), newElement("sonTag"), newEntity("my entity")]) assert $f == "<myTag>my text<sonTag />&my entity;</myTag>"
-
proc add(result: var string; n: XmlNode; indent = 0; indWidth = 2; addNewLines = true) {.inline, ...raises: [], tags: [], forbids: [].}
-
Adds the textual representation of
n
to stringresult
.Example:
Source Editvar a = newElement("firstTag") b = newText("my text") c = newComment("my comment") s = "" s.add(c) s.add(a) s.add(b) assert s == "<!-- my comment --><firstTag />my text"
-
proc addEscaped(result: var string; s: string) {....raises: [], tags: [], forbids: [].}
- The same as result.add(escape(s)), but more efficient. Source Edit
-
proc attr(n: XmlNode; name: string): string {....raises: [], tags: [], forbids: [].}
-
Finds the first attribute of
n
with a name ofname
. Returns "" on failure.See also:
- attrs proc for XmlAttributes getter
- attrs= proc for XmlAttributes setter
- attrsLen proc for number of attributes
Example:
Source Editvar j = newElement("myTag") let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes j.attrs = att assert j.attr("key1") == "first value" assert j.attr("key2") == "second value"
-
proc attrs(n: XmlNode): XmlAttributes {.inline, ...raises: [], tags: [], forbids: [].}
-
Gets the attributes belonging to
n
.Returns
nil
if attributes have not been initialised for this node.See also:
- attrs= proc for XmlAttributes setter
- attrsLen proc for number of attributes
- attr proc for finding an attribute
Example:
Source Editvar j = newElement("myTag") assert j.attrs == nil let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes j.attrs = att assert j.attrs == att
-
proc attrs=(n: XmlNode; attr: XmlAttributes) {.inline, ...raises: [], tags: [], forbids: [].}
-
Sets the attributes belonging to
n
.See also:
- attrs proc for XmlAttributes getter
- attrsLen proc for number of attributes
- attr proc for finding an attribute
Example:
Source Editvar j = newElement("myTag") assert j.attrs == nil let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes j.attrs = att assert j.attrs == att
-
proc attrsLen(n: XmlNode): int {.inline, ...raises: [], tags: [], forbids: [].}
-
Returns the number of
n
's attributes.See also:
- attrs proc for XmlAttributes getter
- attrs= proc for XmlAttributes setter
- attr proc for finding an attribute
Example:
Source Editvar j = newElement("myTag") assert j.attrsLen == 0 let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes j.attrs = att assert j.attrsLen == 2
-
proc child(n: XmlNode; name: string): XmlNode {....raises: [], tags: [], forbids: [].}
-
Finds the first child element of
n
with a name ofname
. Returnsnil
on failure.Example:
Source Editvar f = newElement("myTag") f.add newElement("firstSon") f.add newElement("secondSon") f.add newElement("thirdSon") assert $(f.child("secondSon")) == "<secondSon />"
-
proc clear(n: var XmlNode) {....raises: [], tags: [], forbids: [].}
-
Recursively clears all children of an XmlNode.
Example:
Source Editvar g = newElement("myTag") g.add newText("some text") g.add newComment("this is comment") var h = newElement("secondTag") h.add newEntity("some entity") let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes var k = newXmlTree("treeTag", [g, h], att) doAssert $k == """<treeTag key1="first value" key2="second value"> <myTag>some text<!-- this is comment --></myTag> <secondTag>&some entity;</secondTag> </treeTag>""" clear(k) doAssert $k == """<treeTag key1="first value" key2="second value" />"""
-
proc delete(n: XmlNode; i: Natural) {....raises: [], tags: [], forbids: [].}
-
Deletes the
i
'th child ofn
.See also:
Example:
Source Editvar f = newElement("myTag") f.add newElement("first") f.insert(newElement("second"), 0) f.delete(0) assert $f == """<myTag> <first /> </myTag>"""
-
proc delete(n: XmlNode; slice: Slice[int]) {....raises: [], tags: [], forbids: [].}
-
Deletes the items
n[slice]
ofn
.See also:
Example:
Source Editvar f = newElement("myTag") f.add newElement("first") f.insert([newElement("second"), newElement("third")], 0) f.delete(0..1) assert $f == """<myTag> <first /> </myTag>"""
-
proc escape(s: string): string {....raises: [], tags: [], forbids: [].}
-
Escapes
s
for inclusion into an XML document.Escapes these characters:
char is converted to <
<
>
>
&
&
"
"
'
'
You can also use addEscaped proc.
Source Edit -
proc findAll(n: XmlNode; tag: string; caseInsensitive = false): seq[XmlNode] {. ...raises: [], tags: [], forbids: [].}
-
A shortcut version to assign in let blocks.
Example:
Source Editvar b = newElement("good") c = newElement("bad") d = newElement("BAD") e = newElement("GOOD") b.add newText("b text") c.add newText("c text") d.add newText("d text") e.add newText("e text") let a = newXmlTree("father", [b, c, d, e]) assert $(a.findAll("good")) == "@[<good>b text</good>]" assert $(a.findAll("BAD")) == "@[<BAD>d text</BAD>]" assert $(a.findAll("good", caseInsensitive = true)) == "@[<good>b text</good>, <GOOD>e text</GOOD>]" assert $(a.findAll("BAD", caseInsensitive = true)) == "@[<bad>c text</bad>, <BAD>d text</BAD>]"
-
proc findAll(n: XmlNode; tag: string; result: var seq[XmlNode]; caseInsensitive = false) {....raises: [], tags: [], forbids: [].}
-
Iterates over all the children of
n
returning those matchingtag
.Found nodes satisfying the condition will be appended to the
result
sequence.Example:
Source Editvar b = newElement("good") c = newElement("bad") d = newElement("BAD") e = newElement("GOOD") b.add newText("b text") c.add newText("c text") d.add newText("d text") e.add newText("e text") let a = newXmlTree("father", [b, c, d, e]) var s = newSeq[XmlNode]() a.findAll("good", s) assert $s == "@[<good>b text</good>]" s.setLen(0) a.findAll("good", s, caseInsensitive = true) assert $s == "@[<good>b text</good>, <GOOD>e text</GOOD>]" s.setLen(0) a.findAll("BAD", s) assert $s == "@[<BAD>d text</BAD>]" s.setLen(0) a.findAll("BAD", s, caseInsensitive = true) assert $s == "@[<bad>c text</bad>, <BAD>d text</BAD>]"
-
proc innerText(n: XmlNode): string {....raises: [], tags: [], forbids: [].}
-
Gets the inner text of
n
:- If
n
isxnText
orxnEntity
, returns its content. - If
n
isxnElement
, runs recursively on each child node and concatenates the results. - Otherwise returns an empty string.
See also:
Example:
Source Editvar f = newElement("myTag") f.add newText("my text") f.add newComment("my comment") f.add newEntity("my entity") assert $f == "<myTag>my text<!-- my comment -->&my entity;</myTag>" assert innerText(f) == "my textmy entity"
- If
-
proc insert(father, son: XmlNode; index: int) {.inline, ...raises: [], tags: [], forbids: [].}
-
Inserts the child
son
to a given position infather
.father
must be ofxnElement
kind.See also:
Example:
Source Editvar f = newElement("myTag") f.add newElement("first") f.insert(newElement("second"), 0) assert $f == """<myTag> <second /> <first /> </myTag>"""
-
proc insert(father: XmlNode; sons: openArray[XmlNode]; index: int) {.inline, ...raises: [], tags: [], forbids: [].}
-
Inserts the children openArray`sons` to a given position in
father
.father
must be ofxnElement
kind.See also:
Example:
Source Editvar f = newElement("myTag") f.add newElement("first") f.insert([newElement("second"), newElement("third")], 0) assert $f == """<myTag> <second /> <third /> <first /> </myTag>"""
-
proc newElement(tag: sink string): XmlNode {....raises: [], tags: [], forbids: [].}
-
Creates a new
XmlNode
of kindxnElement
with the giventag
.See also:
Example:
Source Editvar a = newElement("firstTag") a.add newElement("childTag") assert a.kind == xnElement assert $a == """<firstTag> <childTag /> </firstTag>"""
-
proc newXmlTree(tag: sink string; children: openArray[XmlNode]; attributes: XmlAttributes = nil): XmlNode {....raises: [], tags: [], forbids: [].}
-
Creates a new XML tree with
tag
,children
andattributes
.See also:
Example:
Source Editvar g = newElement("myTag") g.add newText("some text") g.add newComment("this is comment") var h = newElement("secondTag") h.add newEntity("some entity") let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes let k = newXmlTree("treeTag", [g, h], att) doAssert $k == """<treeTag key1="first value" key2="second value"> <myTag>some text<!-- this is comment --></myTag> <secondTag>&some entity;</secondTag> </treeTag>"""
-
proc replace(n: XmlNode; i: Natural; replacement: openArray[XmlNode]) {. ...raises: [], tags: [], forbids: [].}
-
Replaces the
i
'th child ofn
withreplacement
openArray.n
must be ofxnElement
kind.See also:
Example:
Source Editvar f = newElement("myTag") f.add newElement("first") f.insert(newElement("second"), 0) f.replace(0, @[newElement("third"), newElement("fourth")]) assert $f == """<myTag> <third /> <fourth /> <first /> </myTag>"""
-
proc replace(n: XmlNode; slice: Slice[int]; replacement: openArray[XmlNode]) {. ...raises: [], tags: [], forbids: [].}
-
Deletes the items
n[slice]
ofn
.n
must be ofxnElement
kind.See also:
Example:
Source Editvar f = newElement("myTag") f.add newElement("first") f.insert([newElement("second"), newElement("fifth")], 0) f.replace(0..1, @[newElement("third"), newElement("fourth")]) assert $f == """<myTag> <third /> <fourth /> <first /> </myTag>"""
-
proc tag(n: XmlNode): lent string {.inline, ...raises: [], tags: [], forbids: [].}
-
Gets the tag name of
n
.n
has to be anxnElement
node.See also:
- text proc for text getter
- text= proc for text setter
- tag= proc for tag setter
- innerText proc
Example:
Source Editvar a = newElement("firstTag") a.add newElement("childTag") assert $a == """<firstTag> <childTag /> </firstTag>""" assert a.tag == "firstTag"
-
proc tag=(n: XmlNode; tag: sink string) {.inline, ...raises: [], tags: [], forbids: [].}
-
Sets the tag name of
n
.n
has to be anxnElement
node.See also:
- text proc for text getter
- text= proc for text setter
- tag proc for tag getter
Example:
Source Editvar a = newElement("firstTag") a.add newElement("childTag") assert $a == """<firstTag> <childTag /> </firstTag>""" a.tag = "newTag" assert $a == """<newTag> <childTag /> </newTag>"""
-
proc text(n: XmlNode): lent string {.inline, ...raises: [], tags: [], forbids: [].}
-
Gets the associated text with the node
n
.n
can be a CDATA, Text, comment, or entity node.See also:
- text= proc for text setter
- tag proc for tag getter
- tag= proc for tag setter
- innerText proc
Example:
Source Editvar c = newComment("my comment") assert $c == "<!-- my comment -->" assert c.text == "my comment"
-
proc text=(n: XmlNode; text: sink string) {.inline, ...raises: [], tags: [], forbids: [].}
-
Sets the associated text with the node
n
.n
can be a CDATA, Text, comment, or entity node.See also:
Example:
Source Editvar e = newEntity("my entity") assert $e == "&my entity;" e.text = "a new entity text" assert $e == "&a new entity text;"
-
proc toXmlAttributes(keyValuePairs: varargs[tuple[key, val: string]]): XmlAttributes {. ...raises: [], tags: [], forbids: [].}
-
Converts
{key: value}
pairs intoXmlAttributes
.Example:
Source Editlet att = {"key1": "first value", "key2": "second value"}.toXmlAttributes var j = newElement("myTag") j.attrs = att doAssert $j == """<myTag key1="first value" key2="second value" />"""
Iterators
-
iterator items(n: XmlNode): XmlNode {.inline, ...raises: [], tags: [], forbids: [].}
-
Iterates over all direct children of
n
.Example:
Source Editvar g = newElement("myTag") g.add newText("some text") g.add newComment("this is comment") var h = newElement("secondTag") h.add newEntity("some entity") g.add h assert $g == "<myTag>some text<!-- this is comment --><secondTag>&some entity;</secondTag></myTag>" # for x in g: # the same as `for x in items(g):` # echo x # some text # <!-- this is comment --> # <secondTag>&some entity;<![CDATA[some cdata]]></secondTag>
Macros
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/xmltree.html