xmlua.NodeSetクラス

概要

複数ノードを管理するクラスです。通常、xmlua.Searchable:searchで返却されるオブジェクトを使います。

例:

local xmlua = require("xmlua")

local document = xmlua.XML.parse("<root><sub/></root>")

document:search("/root") -- -> xmlua.NodeSet

今の所、要素ノード(xmlua.Element)のみを扱います。将来的にはテキストノードのように他のノードもサポートする予定です。

インスタンスメソッド

このクラスは、通常のテーブルに基づいています。つまり、#node_set(ノードセットが持つノードの数を取得する)やnode_set[1](ノードセットの最初のノードを取得する)のような通常のテーブルの機能が使えます。

to_html(options=nil) -> string

ノードセット内の全てのノードをxmlua.Serializable:to_htmlを使ってHTMLへシリアライズし、シリアライズした文字列を結合します。

options: 利用可能なオプションは以下の通りです。

シリアライズに失敗した場合は、エラーが発生します。

例:

local xmlua = require("xmlua")

local document = xmlua.HTML.parse([[
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>World</body>
</html>
]])

-- <html>配下の全ての要素 (<head> and <body>)
local node_set = document:search("/html/*")

-- 全ての要素をHTMLへシリアライズし、シリアライズしたHTMLを結合します。
print(node_set:to_html())
-- <head>
-- <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
--    <title>Hello</title>
--  </head><body>World</body>

-- 参考: <head>要素のシリアライズ
print(node_set[1]:to_html())
-- <head>
-- <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
--    <title>Hello</title>
--  </head>

-- 参考: <body>要素のシリアライズ
print(node_set[2]:to_html())
-- <body>World</body>

to_xml(options=nil) -> string

ノードセット内の全てのノードをxmlua.Serializable:to_xmlを使ってXMLへシリアライズし、シリアライズした文字列を結合します。

options: 利用可能なオプションは以下の通りです。

シリアライズに失敗した場合は、エラーが発生します。

例:

local xmlua = require("xmlua")

local document = xmlua.XML.parse([[
<root>
  <sub1>text1</sub1>
  <sub2>text2</sub2>
  <sub3>text3</sub3>
</root>
]])

-- <root>配下の全ての要素 (<sub1>, <sub2> and <sub3>)
local node_set = document:search("/root/*")

-- 全ての要素をXMLへシリアライズし、シリアライズしたXMLを結合します。
print(node_set:to_xml())
-- <sub1>text1</sub1><sub2>text2</sub2><sub3>text3</sub3>

-- 参考: <sub1>要素のシリアライズ
print(node_set[1]:to_xml())
-- <sub1>text1</sub1>

-- 参考: <sub2>要素のシリアライズ
print(node_set[2]:to_xml())
-- <sub2>text2</sub2>

-- 参考: <sub3>要素のシリアライズ
print(node_set[3]:to_xml())
-- <sub3>text3</sub3>

XPathを使ってノードを検索しxmlua.NodeSetオブジェクトを返します。

ノードセット内のそれぞれのノードに対して、xmlua.Searchable:searchを実行し、xmlua.NodeSet内でマッチしたノードを収集し、xmlua.NodeSetを返します。

例:

local xmlua = require("xmlua")

local xml = [[
<root>
  <sub class="A"><subsub1/></sub>
  <sub class="B"><subsub2/></sub>
  <sub class="A"><subsub3/></sub>
</root>
]]

local document = xmlua.XML.parse(xml)

-- 全ての<sub class="A">要素を検索
local class_a_subs = document:search("//sub[@class='A']")

-- <sub class="a">配下の全ての要素を検索
local subsubs_in_class_a = class_a_subs:search("*")

print(#subsubs_in_class_a) -- -> 2

-- /root/sub[@class="A"]/subsub1
print(subsubs_in_class_a[1]:to_xml())
-- <subsub1/>

-- /root/sub[@class="A"]/subsub3
print(subsubs_in_class_a[2]:to_xml())
-- <subsub3/>

content() -> string

このノードセット内のすべてのノードの内容を取得してそれらを連結します。

例:

local xmlua = require("xmlua")

local document = xmlua.XML.parse([[
<root>
  <sub1>text1</sub1>
  <sub2>text2</sub2>
  <sub3>text3</sub3>
</root>
]])

-- <root>配下の全ての要素 (<sub1>, <sub2> and <sub3>)
local node_set = document:search("/root/*")

-- すべての内容を取得して連結
print(node_set:content())
-- text1text2text3

text() -> string

contentのエイリアス。

paths() -> {path1, path2, ...}

このノードセット内の全てのノードのXPathを返します。

例:

local xmlua = require("xmlua")

local document = xmlua.XML.parse([[
<root>
  <sub1>text1</sub1>
  <sub2>text2</sub2>
  <sub3>text3</sub3>
</root>
]])

-- <root>配下の全ての要素 (<sub1>, <sub2> and <sub3>)
local node_set = document:search("/root/*")
-- <root>配下の全ての要素 (<sub1>, <sub2> and <sub3>)のXPathを返します。
for _, path in ipairs(node_set:paths()) do
  print(path)
  --/root/sub1
  --/root/sub2
  --/root/sub3
end

insert([position,] node) -> void

Nodexmlua.NodeSetに挿入します。ただし、ドキュメントツリーには追加しません。 同じノードが挿入された場合は無視されます。 xmlua.Elementだけではなく、Nodeならなんでも挿入できます。

挿入位置を指定したい場合は、このメソッドの第一引数の挿入位置を指定してください。

例:

local xmlua = require("xmlua")

local document = xmlua.XML.parse([[
<xml>
  <header>
    <title>This is test</title>
  </header>
  <contents>
    <sub1>sub1</sub1>
    <sub2>sub2</sub2>
    <sub3>sub3</sub3>
  </contents>
</xml>
]])

--nodeの挿入
local inserted_node_set = document:search("//title")
-- <title>This is test</title>
local insert_node = document:search("//xml/contents/sub1")[1]
-- <sub1>sub1</sub1>
inserted_node_set:insert(insert_node)

print(inserted_node_set:to_xml())
-- <title>This is test</title><sub1>sub1</sub1>

-- 挿入位置を指定して挿入
local inserted_node_set = document:search("//xml/contents/*")
-- <sub1>sub1</sub1>
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>
local insert_node = document:search("//title")[1]
-- <title>This is test</title>
inserted_node_set:insert(1, insert_node)

print(inserted_node_set:to_xml())
-- <title>This is test</title>
-- <sub1>sub1</sub1>
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>

remove(node_or_position) -> xmlua.Node

Nodexmlua.NodeSetから削除します. ただし、ドキュメントツリーからは削除しません。 削除したNodeを返します。削除出来なかった場合は、nilを返します。

削除するノードの位置を指定したい場合は、このメソッドの第一引数に削除する位置を指定してください。 削除するノードを指定したい場合は、このメソッドの第一引数に削除するノードを指定して下さい。

例:

local xmlua = require("xmlua")

local document = xmlua.XML.parse([[
<xml>
  <header>
    <title>This is test</title>
  </header>
  <contents>
    <sub1>sub1</sub1>
    <sub2>sub2</sub2>
    <sub3>sub3</sub3>
  </contents>
</xml>
]])

-- ノードを削除する。
local removed_node_set = document:search("//xml/contents/*")
-- <sub1>sub1</sub1>
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>
local remove_node = removed_node_set:remove(removed_node_set[1])
print(remove_node:to_xml())
-- <sub1>sub1</sub1>
print(removed_node_set:to_xml())
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>

-- 位置を指定してノードを削除する。
local removed_node_set = document:search("//xml/contents/*")
-- <sub1>sub1</sub1>
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>
local remove_node = removed_node_set:remove(1)
print(remove_node:to_xml())
-- <sub1>sub1</sub1>
print(removed_node_set:to_xml())
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>

merge(node_set) -> xmlua.NodeSet

レシーバー内のノードと引数のノードセット内のノードをマージして新しいノードセットを返します。node_set1:merge(node_set2)という書き方だけでなく、node_set1 + node_set2という書き方もできます。重複したノードは削除します。

例:

local xmlua = require("xmlua")

local document = xmlua.XML.parse([[
<xml>
  <header>
    <title>This is test</title>
  </header>
  <contents>
    <sub1>sub1</sub1>
    <sub2>sub2</sub2>
    <sub3>sub3</sub3>
  </contents>
</xml>
]])
-- ノードをマージする
local node_set1 = document:search("//title")
-- <title>This is test</title>
local node_set2 = document:search("//xml/contents/*")
-- <sub1>sub1</sub1>
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>
local merged_node_set = node_set1:merge(node_set2)
print(merged_node_set:to_xml())
-- <title>This is test</title>
-- <sub1>sub1</sub1>
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>

-- 別の書き方でノードをマージする
local merged_node_set = node_set1 + node_set2
print(merged_node_set:to_xml())
-- <title>This is test</title>
-- <sub1>sub1</sub1>
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>

ノードセット内の全てのノードをドキュメントツリーから削除します。

例:

local xmlua = require("xmlua")

local document = xmlua.XML.parse([[
<xml>
  <header>
    <title>This is test</title>
  </header>
  <contents>
    <sub1>sub1</sub1>
    <sub2>sub2</sub2>
    <sub3>sub3</sub3>
  </contents>
</xml>
]])

--  ノードセット内の全てのノードを削除する。
local node_set = document:search("//xml/contents/*")
-- <sub1>sub1</sub1>
-- <sub2>sub2</sub2>
-- <sub3>sub3</sub3>
node_set:unlink()
print(document:to_xml())
--<?xml version="1.0" encoding="UTF-8"?>
--<xml>
--  <header>
--    <title>This is test</title>
--  </header>
--  <contents>
--
--
--
--  </contents>
--</xml>

参照