xmltree

シンプルな XML ツリージェネレータです。

import xmltree

var g = newElement("myTag")
g.add newText("テキスト")
g.add newComment("これはコメントです")

var h = newElement("secondTag")
h.add newEntity("エンティティ")

let att = {"key1": "第一値", "key2": "第二値"}.toXmlAttributes
let k = newXmlTree("treeTag", [g, h], att)

echo k
# <treeTag key2="第二値" key1="第一値">
#   <myTag>テキスト<!-- これはコメントです --></myTag>
#   <secondTag>&エンティティ;</secondTag>
# </treeTag>

関連:

XmlNode = ref XmlNodeObj

XML ノードで構成された XML ツリーです。

新しいツリーを作成するには newXmlTree プロシージャ を使います。

  ソース 編集
XmlNodeKind = enum
  xnText,                     ## text 要素
  xnElement,                  ## 0 個以上の子要素
  xnCData,                    ## CDATA ノード
  xnEntity,                   ## エンティティ (``&thing;`` など)
  xnComment                   ## XML コメント
各種 XML ノードです。  ソース 編集
XmlAttributes = StringTableRef

文字列マッピングの文字列エイリアスです。

XmlAttributes を作成するには toXmlAttributes プロシージャ を使います。

  ソース 編集

定数

xmlHeader = "\n"
XML の完成出力で使うヘッダです。  ソース 編集

プロシージャ

proc newElement(tag: string): XmlNode {...}{.raises: [], tags: [].}

指定された tagxnElement と同種の XmlNode を新規作成します。

関連:

用例:

var a = newElement("firstTag")
a.add newElement("childTag")
assert a.kind == xnElement
assert $a ==
    """<firstTag>
  <childTag />
</firstTag>"""
  ソース 編集
proc newText(text: string): XmlNode {...}{.raises: [], tags: [].}
テキスト textxnText と同種の XmlNode を新規作成します。

用例:

var b = newText("my text")
assert b.kind == xnText
assert $b == "my text"
  ソース 編集
proc newComment(comment: string): XmlNode {...}{.raises: [], tags: [].}
テキスト commentxnComment と同種の XmlNode を新規作成します。

用例:

var c = newComment("my comment")
assert c.kind == xnComment
assert $c == "<!-- my comment -->"
  ソース 編集
proc newCData(cdata: string): XmlNode {...}{.raises: [], tags: [].}
テキスト cdataxnCData と同種の XmlNode を新規作成します。

用例:

var d = newCData("my cdata")
assert d.kind == xnCData
assert $d == "<![CDATA[my cdata]]>"
  ソース 編集
proc newEntity(entity: string): XmlNode {...}{.raises: [], tags: [].}
テキスト entityxnEntity と同種の XmlNode を新規作成します。

用例:

var e = newEntity("my entity")
assert e.kind == xnEntity
assert $e == "&my entity;"
  ソース 編集
proc newXmlTree(tag: string; children: openArray[XmlNode];
               attributes: XmlAttributes = nil): XmlNode {...}{.raises: [], tags: [].}

tag, children および attributes で XML ツリーを新規作成します。

関連:

var g = newElement("myTag")
g.add newText("テキスト")
g.add newComment("これはコメントです")
var h = newElement("secondTag")
h.add newEntity("エンティティ")
let att = {"key1": "第一値", "key2": "第二値"}.toXmlAttributes
let k = newXmlTree("treeTag", [g, h], att)

echo k
## <treeTag key2="第二値" key1="第一値">
##   <myTag>テキスト<!-- これはコメントです --></myTag>
##   <secondTag>&エンティティ;</secondTag>
## </treeTag>
  ソース 編集
proc text(n: XmlNode): string {...}{.inline, raises: [], tags: [].}

ノード n へ関連するテキストを取得します。

n には CDATA、テキスト、コメント、またはエンティティノードを指定できます。

関連:

用例:

var c = newComment("my comment")
assert $c == "<!-- my comment -->"
assert c.text == "my comment"
  ソース 編集
proc text=(n: XmlNode; text: string) {...}{.inline, raises: [], tags: [].}

ノード n へ関連するテキストを設定します。

n には CDATA、テキスト、コメント、またはエンティティノードを指定できます。

関連:

用例:

var e = newEntity("my entity")
assert $e == "&my entity;"
e.text = "a new entity text"
assert $e == "&a new entity text;"
  ソース 編集
proc tag(n: XmlNode): string {...}{.inline, raises: [], tags: [].}

n のタグ名を取得します。

n には xnElement ノードを指定してください。

関連:

用例:

var a = newElement("firstTag")
a.add newElement("childTag")
assert $a ==
    """<firstTag>
  <childTag />
</firstTag>"""
assert a.tag == "firstTag"
  ソース 編集
proc tag=(n: XmlNode; tag: string) {...}{.inline, raises: [], tags: [].}

n のタグ名を設定します。

n には xnElement ノードを指定してください。

関連:

用例:

var a = newElement("firstTag")
a.add newElement("childTag")
assert $a ==
    """<firstTag>
  <childTag />
</firstTag>"""
a.tag = "newTag"
assert $a ==
    """<newTag>
  <childTag />
</newTag>"""
  ソース 編集
proc rawText(n: XmlNode): string {...}{.inline, raises: [], tags: [].}

参照により隠されている 'text' 文字列を返します。

これはスピードハックに限り使います。

  ソース 編集
proc rawTag(n: XmlNode): string {...}{.inline, raises: [], tags: [].}

参照により隠されている 'tag' 文字列を返します。

これはスピードハックに限り使います。

  ソース 編集
proc innerText(n: XmlNode): string {...}{.raises: [], tags: [].}
n の内部テキストを取得します。
  • nxnText または xnEntity ならば、その内容を返します。
  • nxnElement ならば、各子ノードを再帰処理して結果を連結します。
  • それ以外は空文字列を返します。

関連:

用例:

var f = newElement("myTag")
f.add newText("テキスト")
f.add newComment("コメント")
f.add newEntity("エンティティ")
assert $f == "<myTag>エンティティ<!-- コメント -->&エンティティ;</myTag>"
assert innerText(f) == "テキストエンティティ"
  ソース 編集
proc add(father, son: XmlNode) {...}{.inline, raises: [], tags: [].}

father に子の son を追加します。

関連:

用例:

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 insert(father, son: XmlNode; index: int) {...}{.inline, raises: [], tags: [].}

father の指定位置へ子の son を挿入します。

fatherson には xnElement と同種を指定してください。

関連:

用例:

var f = newElement("myTag")
f.add newElement("first")
f.insert(newElement("second"), 0)
assert $f ==
    """<myTag>
  <second />
  <first />
</myTag>"""
  ソース 編集
proc delete(n: XmlNode; i: Natural) {...}{.noSideEffect, raises: [], tags: [].}

n にある i 番目の子を削除します。

関連:

用例:

var f = newElement("myTag")
f.add newElement("first")
f.insert(newElement("second"), 0)
f.delete(0)
assert $f ==
    """<myTag>
  <first />
</myTag>"""
  ソース 編集
proc len(n: XmlNode): int {...}{.inline, raises: [], tags: [].}
n にある子の個数を返します。

用例:

var f = newElement("myTag")
f.add newElement("first")
f.insert(newElement("second"), 0)
assert len(f) == 2
  ソース 編集
proc kind(n: XmlNode): XmlNodeKind {...}{.inline, raises: [], tags: [].}
n の種類を返します。

用例:

var a = newElement("firstTag")
assert a.kind == xnElement
var b = newText("my text")
assert b.kind == xnText
  ソース 編集
proc `[]`(n: XmlNode; i: int): XmlNode {...}{.inline, raises: [], tags: [].}
n にある i 番目の子を返します。

用例:

var f = newElement("myTag")
f.add newElement("first")
f.insert(newElement("second"), 0)
assert $f[1] == "<first />"
assert $f[0] == "<second />"
  ソース 編集
proc `[]`(n: var XmlNode; i: int): var XmlNode {...}{.inline, raises: [], tags: [].}
n にある i 番目の子を変更可能にして返します。  ソース 編集
proc clear(n: var XmlNode) {...}{.raises: [], tags: [].}
XmlNode にある子孫を再帰的に消去します。
var g = newElement("myTag")
g.add newText("テキスト")
g.add newComment("これはコメントです")

var h = newElement("secondTag")
h.add newEntity("エンティティ")

let att = {"key1": "第一値", "key2": "第二値"}.toXmlAttributes
var k = newXmlTree("treeTag", [g, h], att)

echo k
## <treeTag key2="第二値" key1="第一値">
##   <myTag>テキスト<!-- これはコメントです --></myTag>
##   <secondTag>&エンティティ;</secondTag>
## </treeTag>

clear(k)
echo k
## <treeTag key2="第二値" key1="第一値" />
  ソース 編集
proc toXmlAttributes(keyValuePairs: varargs[tuple[key, val: string]]): XmlAttributes {...}{.
    raises: [], tags: [].}
{key: value} のペアを XmlAttributes へ変換します。
let att = {"key1": "first value", "key2": "second value"}.toXmlAttributes
var j = newElement("myTag")
j.attrs = att

echo j
## <myTag key2="second value" key1="first value" />
  ソース 編集
proc attrs(n: XmlNode): XmlAttributes {...}{.inline, raises: [], tags: [].}

n の所属元となる属性を取得します。

このノードで属性が初期化されていないときは nil を返します。

関連:

用例:

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

n の所属先となる属性を設定します。

関連:

用例:

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

n の属性数を返します。

関連:

用例:

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 attr(n: XmlNode; name: string): string {...}{.raises: [], tags: [].}

name の名前で n にある最初の属性を検索します。失敗時は "" を返します。

関連:

用例:

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

n のクライアントデータを取得します。

クライアントのデータフィールドは HTML パーザーとジェネレータで使います。

  ソース 編集
proc clientData=(n: XmlNode; data: int) {...}{.inline, raises: [], tags: [].}

n のクライアントデータを設定します。

クライアントのデータフィールドは HTML パーザーとジェネレータで使います。

  ソース 編集
proc addEscaped(result: var string; s: string) {...}{.raises: [], tags: [].}
result.add(escape(s)) と同じですが、こちらのほうが効率的です。  ソース 編集
proc escape(s: string): string {...}{.raises: [], tags: [].}

XML ドキュメントへ挿入するために s をエスケープします。

エスケープ対象の文字:

文字変換先
<&lt;
>&gt;
&&amp;
"&quot;
'&apos;

addEscaped プロシージャ も使えます。

  ソース 編集
proc add(result: var string; n: XmlNode; indent = 0; indWidth = 2; addNewLines = true) {...}{.
    raises: [], tags: [].}
文字列 result へテキスト形式表現の n を 追加します。

用例:

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 `$`(n: XmlNode): string {...}{.raises: [], tags: [].}

n を文字列形式へ変換します。

<$xml ...$> 宣言は生成されませんが、 XML の断片は構成可能なものとして生成されます。

  ソース 編集
proc child(n: XmlNode; name: string): XmlNode {...}{.raises: [], tags: [].}
name の名前で n にある最初の子要素を検索します。失敗時は nil を返します。

用例:

var f = newElement("myTag")
f.add newElement("firstSon")
f.add newElement("secondSon")
f.add newElement("thirdSon")
assert $(f.child("secondSon")) == "<secondSon />"
  ソース 編集
proc findAll(n: XmlNode; tag: string; result: var seq[XmlNode]; caseInsensitive = false) {...}{.
    raises: [], tags: [].}

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 findAll(n: XmlNode; tag: string; caseInsensitive = false): seq[XmlNode] {...}{.
    raises: [], tags: [].}
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>]"
  ソース 編集

イテレータ

iterator items(n: XmlNode): XmlNode {...}{.inline, raises: [], tags: [].}

n にあるすべての子孫にイテレートを直接行います。

用例:

var g = newElement("myTag")
g.add newText("テキスト")
g.add newComment("これはコメントです")

var h = newElement("secondTag")
h.add newEntity("エンティティ")
g.add h

assert $g == "<myTag>テキスト<!-- これはコメントです --><secondTag>&エンティティ;</secondTag></myTag>"
for x in g: # `for x in items(g):` と同じです
  echo x

# テキスト
# <!-- これはコメントです -->
# <secondTag>&エンティティ;<![CDATA[some cdata]]></secondTag>
  ソース 編集
iterator mitems(n: var XmlNode): var XmlNode {...}{.inline, raises: [], tags: [].}
変更可能にするために n にあるすべての子孫にイテレートを直接行います。  ソース 編集

マクロ

macro `<>`(x: untyped): untyped
XML のコンストラクタ・マクロです。 用例:
<>a(href="http://nim-lang.org", newText("Nim のルール。"))

生成される XML ツリーは、

<a href="http://nim-lang.org">Nim のルール。</a>

  ソース 編集