Spec-Zone.ru › Nim

std/xmltree

ИсточникИзменить

Простой генератор XML-дерева.

Пример:

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>"""
См. также:
  • модуль xmlparser для высокоуровневого парсинга XML
  • модуль parsexml для низкоуровневого парсинга XML
  • модуль htmlgen для генерации HTML-кода

Импорты

since, macros, strtabs, strutils, sequtils

Типы

XmlAttributes = StringTableRef

Псевдоним для отображения «строка-строка».

Используйте процедуру toXmlAttributes, чтобы создать XmlAttributes.

Источник Изменить
XmlNode = ref XmlNodeObj

XML-дерево, состоящее из XML-узлов.

Используйте процедуру newXmlTree для создания нового дерева.

Источник Изменить
XmlNodeKind = enum
  xnText,                   ## a text element
  xnVerbatimText, xnElement, ## an element with 0 or more children
  xnCData,                  ## a CDATA node
  xnEntity,                 ## an entity (like ``&thing;``)
  xnComment                  ## an XML comment
Разные типы XML-узлов. Источник Изменить

Константы

xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
Заголовок для полного вывода XML. Источник Изменить

Процедуры

proc `$`(n: XmlNode): string {....raises: [], tags: [], forbids: [].}

Преобразует n в его строковое представление.

Не генерируется объявление <$xml ...$>, чтобы сгенерированные фрагменты XML можно было комбинировать.

Исходный код Изменить
proc `[]`(n: var XmlNode; i: int): var XmlNode {.inline, ...raises: [], tags: [],
    forbids: [].}
Возвращает i-ый дочерний элемент n, чтобы его можно было изменить. Исходный код Изменить
proc `[]`(n: XmlNode; i: int): XmlNode {.inline, ...raises: [], tags: [],
    forbids: [].}
Возвращает i-ый дочерний элемент n.

Пример:

var f = newElement("myTag")
f.add newElement("first")
f.insert(newElement("second"), 0)
assert $f[1] == "<first />"
assert $f[0] == "<second />"
Исходный код Изменить
proc add(father, son: XmlNode) {.inline, ...raises: [], tags: [], forbids: [].}

Добавляет дочерний элемент son к father. father должен быть типа xnElement

См. также:

  • процедура add
  • процедура insert
  • процедура insert
  • процедура delete
  • процедура delete
  • процедура replace
  • процедура replace

Пример:

var 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: [].}

Добавляет дочерние элементы sons к father. father должны быть типа xnElement

См. также:

  • процедура add
  • процедура insert
  • процедура insert
  • процедура delete
  • процедура delete
  • процедура replace
  • процедура replace

Пример:

var 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: [].}
Добавляет текстовое представление n в строку result.

Пример:

var
  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: [].}
То же, что и result.add(escape(s)), но более эффективно. Исходный код Изменить
proc attr(n: XmlNode; name: string): string {....raises: [], tags: [], forbids: [].}

Находит первый атрибут n с именем name. Возвращает "" при неудаче.

См. также:

  • процедура attrs для получения XmlAttributes
  • процедура attrs= для установки XmlAttributes
  • процедура attrsLen для количества атрибутов

Пример:

var 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: [].}

Получает атрибуты, принадлежащие n.

Возвращает nil если атрибуты для этого узла не были инициализированы.

См. также:

  • процедура attrs= для установки XmlAttributes
  • процедура attrsLen для количества атрибутов
  • процедура attr для поиска атрибута

Пример:

var 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: [].}

Устанавливает атрибуты, принадлежащие n.

См. также:

  • процедура attrs для получения XmlAttributes
  • процедура attrsLen для количества атрибутов
  • процедура attr для поиска атрибута

Пример:

var 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: [].}

Возвращает количество атрибутов узла n.

См. также:

  • процедура attrs для получения XmlAttributes
  • процедура attrs= для установки XmlAttributes
  • процедура attr для поиска атрибута

Пример:

var 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: [].}
Находит первый дочерний элемент n с именем name. Возвращает nil при неудаче.

Пример:

var 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: [].}
Рекурсивно очищает все дочерние элементы XmlNode.

Пример:

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
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 clientData(n: XmlNode): int {.inline, ...raises: [], tags: [], forbids: [].}

Получает клиентские данные n.

Поле клиентских данных используется HTML-парсером и генератором.

Исходный код Изменить
proc clientData=(n: XmlNode; data: int) {.inline, ...raises: [], tags: [],
    forbids: [].}

Устанавливает клиентские данные n.

Поле клиентских данных используется HTML-парсером и генератором.

Исходный код Изменить
proc delete(n: XmlNode; i: Natural) {....raises: [], tags: [], forbids: [].}

Удаляет i-ый дочерний элемент n.

См. также:

  • процедура delete
  • процедура add
  • процедура add
  • процедура insert
  • процедура insert
  • процедура replace
  • процедура replace

Пример:

var 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: [].}

Удаляет элементы n[slice] из n.

См. также:

  • процедура delete
  • процедура add
  • процедура add
  • процедура insert
  • процедура insert
  • процедура replace
  • процедура replace

Пример:

var 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: [].}

Выполняет экранирование s для включения в XML-документ.

Экранируются следующие символы:

char преобразуется в
< &lt;
> &gt;
& &amp;
" &quot;
' &apos;

Вы также можете использовать addEscaped процедуру.

Исходный код Редактировать
proc findAll(n: XmlNode; tag: string; caseInsensitive = false): seq[XmlNode] {.
    ...raises: [], tags: [], forbids: [].}
Краткая версия для присвоения в блоках let.

Пример:

var
  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: [].}

Проходит по всем дочерним узлам n и возвращает те, которые соответствуют tag.

Найденные узлы, удовлетворяющие условию, будут добавлены в последовательность result.

Пример:

var
  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: [].}
Получает внутренний текст n:
  • Если n является xnText или xnEntity, возвращает его содержимое.
  • Если n является xnElement, выполняет рекурсивный поиск по каждому дочернему узлу и конкатенирует результаты.
  • В противном случае возвращает пустую строку.

См. также:

  • процедуру text

Пример:

var 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"
Исходный код Редактировать
proc insert(father, son: XmlNode; index: int) {.inline, ...raises: [], tags: [],
    forbids: [].}

Вставляет дочерний элемент son в заданную позицию в father.

father должен быть типа xnElement.

См. также:

  • процедуру insert
  • процедуру add
  • процедуру add
  • процедуру delete
  • процедуру delete
  • процедуру replace
  • процедуру replace

Пример:

var 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: [].}

Вставляет массив children openArray`sons` в заданную позицию в father.

father должен быть типа xnElement.

См. также:

  • процедуру insert
  • процедуру add
  • процедуру add
  • процедуру delete
  • процедуру delete
  • процедуру replace
  • процедуру replace

Пример:

var f = newElement("myTag")
f.add newElement("first")
f.insert([newElement("second"), newElement("third")], 0)
assert $f == """<myTag>
  <second />
  <third />
  <first />
</myTag>"""
Исходный код Редактировать
proc kind(n: XmlNode): XmlNodeKind {.inline, ...raises: [], tags: [], forbids: [].}
Возвращает тип n.

Пример:

var a = newElement("firstTag")
assert a.kind == xnElement
var b = newText("my text")
assert b.kind == xnText
Исходный код Редактировать
proc len(n: XmlNode): int {.inline, ...raises: [], tags: [], forbids: [].}
Возвращает количество дочерних элементов n.

Пример:

var f = newElement("myTag")
f.add newElement("first")
f.insert(newElement("second"), 0)
assert len(f) == 2
Исходный код Редактировать
proc newCData(cdata: sink string): XmlNode {....raises: [], tags: [], forbids: [].}
Создаёт новый XmlNode типа xnCData с текстом cdata.

Пример:

var d = newCData("my cdata")
assert d.kind == xnCData
assert $d == "<![CDATA[my cdata]]>"
Исходный код Редактировать
proc newComment(comment: sink string): XmlNode {....raises: [], tags: [],
    forbids: [].}
Создаёт новый XmlNode типа xnComment с текстом comment.

Пример:

var c = newComment("my comment")
assert c.kind == xnComment
assert $c == "<!-- my comment -->"
Исходный код Редактировать
proc newElement(tag: sink string): XmlNode {....raises: [], tags: [], forbids: [].}

Создаёт новый XmlNode типа xnElement с заданным tag.

См. также:

  • процедуру newXmlTree
  • <> макрос

Пример:

var a = newElement("firstTag")
a.add newElement("childTag")
assert a.kind == xnElement
assert $a == """<firstTag>
  <childTag />
</firstTag>"""
Исходный код Редактировать
proc newEntity(entity: string): XmlNode {....raises: [], tags: [], forbids: [].}
Создаёт новый XmlNode типа xnEntity с текстом entity.

Пример:

var e = newEntity("my entity")
assert e.kind == xnEntity
assert $e == "&my entity;"
Исходный код Редактировать
proc newText(text: sink string): XmlNode {....raises: [], tags: [], forbids: [].}
Создаёт новый XmlNode типа xnText с текстом text.

Пример:

var b = newText("my text")
assert b.kind == xnText
assert $b == "my text"
Исходный код Редактировать
proc newVerbatimText(text: sink string): XmlNode {....raises: [], tags: [],
    forbids: [].}
Создаёт новый XmlNode типа xnVerbatimText с текстом text. С версии: 1.3. Исходный код Редактировать
proc newXmlTree(tag: sink string; children: openArray[XmlNode];
                attributes: XmlAttributes = nil): XmlNode {....raises: [],
    tags: [], forbids: [].}

Создаёт новое XML-дерево с tag, children и attributes.

См. также:

  • процедурой newElement
  • <> макрос

Пример:

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>"""
Исходный код Редактировать
proc rawTag(n: XmlNode): string {.inline, ...raises: [], tags: [], forbids: [].}

Возвращает строку 'tag' по ссылке.

Используется только для оптимизации.

Исходный код Редактировать
proc rawText(n: XmlNode): string {.inline, ...raises: [], tags: [], forbids: [].}

Возвращает строку 'text' по ссылке.

Используется только для оптимизации.

Исходный код Редактировать
proc replace(n: XmlNode; i: Natural; replacement: openArray[XmlNode]) {.
    ...raises: [], tags: [], forbids: [].}

Заменяет i-й дочерний элемент n на replacement openArray.

n должен быть типа xnElement.

См. также:

  • процедура замены
  • процедура добавления
  • процедура добавления
  • процедура удаления
  • процедура удаления
  • процедура вставки
  • процедура вставки

Пример:

var 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: [].}

Удаляет элементы n[slice] из n.

n должен быть типа xnElement.

См. также:

  • процедура замены
  • процедура добавления
  • процедура добавления
  • процедура удаления
  • процедура удаления
  • процедура вставки
  • процедура вставки

Пример:

var 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: [].}

Получает имя тега n.

n должен быть узлом типа xnElement.

См. также:

  • процедура text для получения текста
  • процедура text= для установки текста
  • процедура tag= для установки тега
  • процедура innerText

Пример:

var 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: [].}

Устанавливает имя тега n.

n должен быть узлом типа xnElement.

См. также:

  • процедура text для получения текста
  • процедура text= для установки текста
  • процедура tag для получения тега

Пример:

var 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: [].}

Получает связанный текст с узлом n.

n может быть узлом CDATA, Text, комментария или сущности.

См. также:

  • процедура text= для установки текста
  • процедура tag для получения тега
  • процедура tag= для установки тега
  • процедура innerText

Пример:

var c = newComment("my comment")
assert $c == "<!-- my comment -->"
assert c.text == "my comment"
Исходный код Редактировать
proc text=(n: XmlNode; text: sink string) {.inline, ...raises: [], tags: [],
    forbids: [].}

Устанавливает связанный текст с узлом n.

n может быть узлом CDATA, Text, комментария или сущности.

См. также:

  • процедура text для получения текста
  • процедура tag для получения тега
  • процедура tag= для установки тега

Пример:

var 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: [].}
Преобразует {key: value} пары в XmlAttributes.

Пример:

let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes
var j = newElement("myTag")
j.attrs = att

doAssert $j == """<myTag key1="first value" key2="second value" />"""
Исходный код Редактировать

Итераторы

iterator items(n: XmlNode): XmlNode {.inline, ...raises: [], tags: [], forbids: [].}
Итерируется по всем непосредственным дочерним элементам n .

Пример:

var 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>
Исходный код Редактировать
iterator mitems(n: var XmlNode): var XmlNode {.inline, ...raises: [], tags: [],
    forbids: [].}
Итерируется по всем непосредственным дочерним элементам n для их изменения. Исходный код Редактировать

Макросы

macro `<>`(x: untyped): untyped

Макрос-конструктор для XML. Пример использования:

<>a(href="http://nim-lang.org", newText("Nim rules."))

Генерирует XML-дерево для:

<a href="http://nim-lang.org">Nim rules.</a>
Исходный код Редактировать

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/xmltree.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API