# Module xmltree

A simple XML tree. More efficient and simpler than the DOM.

# Imports

macros, strtabs

# Types

    PXmlNode* = ref TXmlNode

  an XML tree consists of `PXmlNode`'s.

    TXmlNodeKind* = enum
      xnText,                     ## a text element
      xnElement,                  ## an element with 0 or more children
      xnCData,                    ## a CDATA node
      xnEntity,                   ## an entity (like ``&thing;``)
      xnComment                   ## an XML comment

  different kinds of `PXmlNode`'s

    PXmlAttributes* = PStringTable

  an alias for a string to string mapping

# Consts

    xmlHeader* = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\x0A"

  header to use for complete XML output

# Procs

    proc newElement*(tag: string): PXmlNode

  creates a new `PXmlNode` of kind `xnText` with the given tag.

    proc newText*(text: string): PXmlNode

  creates a new `PXmlNode` of kind `xnText` with the text text.

    proc newComment*(comment: string): PXmlNode

  creates a new `PXmlNode` of kind `xnComment` with the text comment.

    proc newCData*(cdata: string): PXmlNode

  creates a new `PXmlNode` of kind `xnComment` with the text cdata.

    proc newEntity*(entity: string): PXmlNode

  creates a new `PXmlNode` of kind `xnEntity` with the text entity.

    proc text*(n: PXmlNode): string {.inline.}

  gets the associated text with the node n. n can be a CDATA, Text, comment, or entity node.

    proc innerText*(n: PXmlNode): string

  gets the inner text of n. n has to be an `xnElement` node. Only `xnText` and `xnEntity` nodes are considered part of n's inner text, other child nodes are silently ignored.

    proc tag*(n: PXmlNode): string {.inline.}

  gets the tag name of n. n has to be an `xnElement` node.

    proc add*(father, son: PXmlNode) {.inline.}

  adds the child son to father.

    proc len*(n: PXmlNode): int {.inline.}

  returns the number n's children.

    proc kind*(n: PXmlNode): TXmlNodeKind {.inline.}

  returns n's kind.

    proc `[]`*(n: PXmlNode; i: int): PXmlNode {.inline.}

  returns the i'th child of n.

    proc attrs*(n: PXmlNode): PXmlAttributes {.inline.}

  gets the attributes belonging to n.

    proc `attrs =`*(n: PXmlNode; attr: PXmlAttributes) {.inline.}

  sets the attributes belonging to n.

    proc attrsLen*(n: PXmlNode): int {.inline.}

  returns the number of n's attributes.

    proc clientData*(n: PXmlNode): int {.inline.}

  gets the client data of n. The client data field is used by the HTML parser and generator.

    proc `clientData =`*(n: PXmlNode; data: int) {.inline.}

  sets the client data of n. The client data field is used by the HTML parser and generator.

    proc addEscaped*(result: var string; s: string)

  same as `result.add(escape(s))`, but more efficient.

    proc escape*(s: string): string

  escapes s for inclusion into an XML document. Escapes these characters:

  char | is converted to
  --- | ---
  `<` | `&lt;`
  `>` | `&gt;`
  `&` | `&amp;`
  `"` | `&quot;`

    proc add*(result: var string; n: PXmlNode; indent = 0; indWidth = 2)

  adds the textual representation of n to result.

    proc `$`*(n: PXmlNode): string

  converts n into its string representation. No `<$xml ...$>` declaration is produced, so that the produced XML fragments are composable.

    proc newXmlTree*(tag: string; children: openArray[PXmlNode];
                     attributes: PXmlAttributes = nil): PXmlNode

  creates a new XML tree with tag, children and attributes

    proc child*(n: PXmlNode; name: string): PXmlNode

  Finds the first child element of n with a name of name. Returns nil on failure.

    proc attr*(n: PXmlNode; name: string): string

  Finds the first attribute of n with a name of name.

# Iterators

    iterator items*(n: PXmlNode): PXmlNode {.inline.}

  iterates over any child of n.

# Macros

    macro `<>`*(x: expr): expr {.immediate.}

  Constructor macro for XML. Example usage:

      <>a(href="http://nimrod-code.org", "Nimrod rules.")

  Produces an XML tree for:

      <a href="http://nimrod-code.org">Nimrod rules.</a>

Generated: 2012-09-23 21:47:54 UTC