xmlua.SearchableモジュールXPathを使ってノードを検索する機能を提供します。
search(xpath[, namespace]) -> xmlua.NodeSetXPathを使ってノードを検索しxmlua.NodeSetオブジェクトを返します。
レシーバーがxmlua.Documentの場合はXPathのコンテキストノードはルートノードになります。
レシーバーがxmlua.Elementの場合、XPathのコンテキストノードはレシーバーの要素になります。つまり、XPathの「.」はレシーバーの要素です。
xpath: ノードを検索するためのXPath文字列です。
namespace: カスタマイズされた名前空間です。デフォルトの名前空間を使用する場合は、この引数を省略する必要があります。
XPathでの検索に失敗した場合は、エラーが発生します。
例:
local xmlua = require("xmlua")
local xml = [[
<root>
  <sub1>text1</sub1>
  <sub2>text2</sub2>
  <sub3>text3</sub3>
</root>
]]
local document = xmlua.XML.parse(xml)
-- <root>要素配下の要素をすべて検索します。
local all_subs = document:search("/root/*")
-- "#"を使ってマッチしたノードの数を出力できます。
print(#all_subs) -- -> 3
-- "[]"を使って、N番目のノードにアクセスできます。
print(all_subs[1]:to_xml()) -- -> <sub1>text1</sub1>
print(all_subs[2]:to_xml()) -- -> <sub2>text2</sub2>
print(all_subs[3]:to_xml()) -- -> <sub3>text3</sub3>
ルート要素からでも検索できます。
例:
local xmlua = require("xmlua")
local xml = [[
<root>
  <sub1>text1</sub1>
  <sub2>text2</sub2>
  <sub3>text3</sub3>
</root>
]]
local document = xmlua.XML.parse(xml)
-- ルート要素
local root = document:root()
-- <root>要素配下の要素をすべて検索します。
local all_subs = root:search("*")
-- "#"を使ってマッチしたノードの数を出力できます。
print(#all_subs) -- -> 3
-- "[]"を使って、N番目のノードにアクセスできます。
print(all_subs[1]:to_xml()) -- -> <sub1>text1</sub1>
print(all_subs[2]:to_xml()) -- -> <sub2>text2</sub2>
print(all_subs[3]:to_xml()) -- -> <sub3>text3</sub3>
名前空間のあるドキュメントを検索することもできます。 デフォルトの名前空間を使いたい場合は、以下のように明示的に名前空間を指定する必要があります。
例:
local xmlua = require("xmlua")
local xml = [[
<example:root xmlns:example="http://example.com/">
  <example:sub>text</example:sub>
</example:root>
]]
local document = xmlua.XML.parse(xml)
local example_sub = document:search("/example:root/example:sub")
print(example_sub[1]:to_xml()) -- -> <example:sub>text</example:sub>
以下のように、カスタマイズした名前空間を使うこともできます。
例:
local xmlua = require("xmlua")
local xml = [[
<example:root xmlns:example="http://example.com/">
  <example:sub>text</example:sub>
</example:root>
]]
local namespaces = {
  {
    prefix = "e",
    href = "http://example.com/",
  }
}
local document = xmlua.XML.parse(xml)
local example_sub = document:search("/e:root/e:sub", namespace)
print(example_sub[1]:to_xml()) -- -> <example:sub>text</example:sub>
xpath_search(xpath) -> xmlua.NodeSetsearchの別名です。
css_select(css_selectors) -> xmlua.NodeSetCSSセレクターを使ってノードを検索しxmlua.NodeSetオブジェクトを返します。
レシーバーがxmlua.Documentの場合はCSSセレクターのコンテキストノードはルートノードになります。
レシーバーがxmlua.Elementの場合、CSSセレクターのコンテキストノードはレシーバーの要素になります。つまり、現在の要素がレシーバーの要素になります。
css_selectors: ノードを検索するためのCSSセレクター文字列です。
CSSセレクターが不正な場合はエラーが発生します。
例:
local xmlua = require("xmlua")
local xml = [[
<root>
  <sub1>text1</sub1>
  <sub2>text2</sub2>
  <sub3>text3</sub3>
</root>
]]
local document = xmlua.XML.parse(xml)
-- <root>要素配下の要素をすべて検索します。
local all_subs = document:css_select("root *")
-- "#"を使ってマッチしたノードの数を出力できます。
print(#all_subs) -- -> 3
-- "[]"を使って、N番目のノードにアクセスできます。
print(all_subs[1]:to_xml()) -- -> <sub1>text1</sub1>
print(all_subs[2]:to_xml()) -- -> <sub2>text2</sub2>
print(all_subs[3]:to_xml()) -- -> <sub3>text3</sub3>
ルート要素からでも検索できます。
例:
local xmlua = require("xmlua")
local xml = [[
<root>
  <sub1>text1</sub1>
  <sub2>text2</sub2>
  <sub3>text3</sub3>
</root>
]]
local document = xmlua.XML.parse(xml)
-- ルート要素
local root = document:root()
-- <root>要素配下の要素をすべて検索します。
local all_subs = root:css_select("*")
-- "#"を使ってマッチしたノードの数を出力できます。
print(#all_subs) -- -> 3
-- "[]"を使って、N番目のノードにアクセスできます。
print(all_subs[1]:to_xml()) -- -> <sub1>text1</sub1>
print(all_subs[2]:to_xml()) -- -> <sub2>text2</sub2>
print(all_subs[3]:to_xml()) -- -> <sub3>text3</sub3>
XPath: XPathの仕様です。
xmlua.Document: HTMLドキュメントとXMLドキュメント用のクラスです。
xmlua.Element: 要素ノード用のクラスです。
xmlua.NodeSet: 複数ノードを扱うためのクラスです。