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 для создания нового дерева.
Источник Изменить
Константы
Процедуры
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 преобразуется в <<>>&&""''Вы также можете использовать 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, выполняет рекурсивный поиск по каждому дочернему узлу и конкатенирует результаты. - В противном случае возвращает пустую строку.
См. также:
Пример:
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.См. также:
Пример:
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.См. также:
Пример:
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наreplacementopenArray.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