xmlua.XMLSAXParser クラス

概要

このクラスは、SAX(Simple API for XML)を使ってXMLをパースするクラスです。

SAXは、DOMと異なりドキュメントを一行ずつパースし、DOMはすべてのドキュメントをメモリに読み込んだあとにパースを行います。そのため、SAXはDOMと比べて少ないメモリで高速に動作します。

このクラスを使って、以下のイベントが起こった際に呼ばれるコールバックメソッドを登録できます。

コールバックイベント一覧:

クラスメソッド

xmlua.XMLSAXParser.new() -> XMLSAXParser

XMLSAXParser オブジェクトを作成します。

以下の例のように、xmlua.XMLSAXParserクラスのオブジェクトを作成できます。

例:

local xmlua = require("xmlua")

local parser = xmlua.XMLSAXParser.new()

インスタンスメソッド

parse(xml) -> boolean

xml: パース対象のXML文字列

与えられたXMLをパースします。XMLのパースが成功した場合は、このメソッドはtrueを返します。XMLのパースに失敗した場合は、falseを返します。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<root>Hello </root>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

finish() -> boolean

SAXを使ったXMLのパースを終了します。

parseを使ってパースを開始した場合は、パース完了後にこのメソッドを呼ぶ必要があります。

このメソッドを呼ばないと、end_documentイベントは発生しません。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<root>Hello </root>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end


parser:finish()

プロパティ

start_document

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.start_document = function()
  -- 実行したいコード
end

document要素のパースを開始したときに、登録した関数が呼び出されます。

以下の例だと、<root>をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- XML to be parsed
local xml = [[
<xml>Hello</xml>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.start_document = function()
  print("Start document")
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Start document

end_document

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.end_document = function()
  -- 実行したいコード
end

xmlua.XMLSAXParser.finish を呼び出した時に、登録した関数が呼び出されます。

以下の例では、parser:finish()を実行したときに登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- XML to be parsed
local xml = [[
<xml>Hello</xml>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.end_document = function()
  print("End document")
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

End document

element_declaration

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.element_declaration = function(name, type, content)
  -- 実行したいコード
end

DTD内のelement宣言をパースしたときに、登録した関数が呼び出されます。

以下の例では、<!ELEMENT test (A,B*,C+)>をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE example [
  <!ELEMENT test (A,B*,C+)>
]>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.element_declaration = function(name,
                                      element_type,
                                      content)
  print("Element name: " .. name)
  print("Element type: " .. element_type)
  if element_type == "EMPTY" then
    return
  end
  print("Content:")
  print_element_content(content, "  ")
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Element name: test
Element type: ELEMENT
Content:
  type: SEQUENCE
  occur: ONCE
  child[1]:
    type: ELEMENT
    occur: ONCE
    prefix: 
    name: A
  child[2]:
    type: ELEMENT
    occur: MULTIPLE
    prefix: 
    name: B
  child[3]:
    type: ELEMENT
    occur: PLUS
    prefix: 
    name: C

attribute_declaration

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.attribute_declaration = function(name,
                                        attribute_name,
                                        attribute_type,
                                        default_value_type,
                                        default_value,
                                        enumerated_values)
  -- 実行したいコード
end

DTD内のattribute宣言をパースしたときに、登録した関数が呼び出されます。

以下の例では、<!ATTLIST A B (yes|no) "no">をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE example [
  <!ATTLIST A B (yes|no) "no">
]>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.attribute_declaration = function(name,
                                        attribute_name,
                                        attribute_type,
                                        default_value_type,
                                        default_value,
                                        enumerated_values)
  print("Element name: " .. name)
  print("Attribute name: " .. attribute_name)
  print("Attribute type: " .. attribute_type)
  if default_value then
    print("Default value type: " .. default_value_type)
    print("Default value: " .. default_value)
  end
  for _, v in pairs(enumerated_values) do
    print("Enumrated value: " .. v)
  end
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Attribute name: B
Attribute type: 9
Default value type: 1
Default value: no
Enumrated value: yes
Enumrated value: no

notation_declaration

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.notation_declaration = function(name,
                                       public_id,
                                       system_id)
  -- 実行したいコード
end

DTD内のnotation宣言をパースしたときに、登録した関数が呼び出されます。

以下の例では、<!NOTATION test SYSTEM "Test">をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE example [
  <!NOTATION test SYSTEM "Test">
]>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.notation_declaration = function(name,
                                       public_id,
                                       system_id)
  print("Notation name: " .. name)
  if public_id ~= nil then
    print("Notation public id: " .. public_id)
  end
  if system_id ~= nil then
    print("Notation system id: " .. system_id)
  end
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Notation name: test
Notation system id: Test

unparsed_entity_declaration

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.unparsed_entity_declaration = function(name,
                                              public_id,
                                              system_id,
                                              notation_name)
  -- 実行したいコード
end

DTD内の未解析の外部エンティティをパースしたときに、登録した関数が呼び出されます。

以下の例では、<!ENTITY test SYSTEM "file:///usr/local/share/test.gif" NDATA gif>をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE example [
  <!ENTITY test SYSTEM "file:///usr/local/share/test.gif" NDATA gif>
]>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.unparsed_entity_declaration = function(name,
                                              public_id,
                                              system_id,
                                              notation_name)
  print("Unparserd entity name: " .. name)
  if public_id ~= nil then
    print("Unparserd entity public id: " .. public_id)
  end
  if system_id ~= nil then
    print("Unparserd entity system id: " .. system_id)
  end
  print("Unparserd entity notation_name: " .. notation_name)
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Unparserd entity name: test
Unparserd entity system id: file:///usr/local/share/test.gif
Unparserd entity notation_name: gif

entity_declaration

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.entity_declaration = function(name,
                                     entity_type,
                                     public_id,
                                     system_id,
                                     content)
  -- 実行したいコード
end

DTD内のentity宣言をパースしたときに、登録した関数が呼び出されます。

以下の例では、<!ENTITY test "This is test.">をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE example [
  <!ENTITY test "This is test.">
]>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.entity_declaration = function(name,
                                     entity_type,
                                     public_id,
                                     system_id,
                                     content)
  print("Entity name: " .. name)
  print("Entity type: " .. entity_type)
  if public_id ~= nil then
    print("Entity public id: " .. public_id)
  end
  if system_id ~= nil then
    print("Entity system id: " .. system_id)
  end
  print("Entity content: " .. content)
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Entity name: test
Entity type: 1
Entity content: This is test.

internal_subset

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.internal_subset = function(name,
                                  external_id,
                                  system_id)
  -- 実行したいコード
end

内部サブセットをパースしたときに、登録した関数が呼び出されます。

以下の例では、<!DOCTYPE example[...]>をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE example [
  <!ENTITY test "This is test.">
]>
<example/>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.internal_subset = function(name,
                                  external_id,
                                  system_id)
  print("Internal subset name: " .. name)
  if external_id ~= nil then
    print("Internal subset external id: " .. external_id)
  end
  if system_id ~= nil then
    print("Internal subset system id: " .. system_id)
  end
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Internal subset name: example

external_subset

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.external_subset = function(name,
                                  external_id,
                                  system_id)
  -- 実行したいコード
end

外部サブセットをパースしたときに、登録した関数が呼び出されます。

以下の例では、<!DOCTYPE example[...]>をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- XML to be parsed
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html></html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.external_subset = function(name,
                                  external_id,
                                  system_id)
  print("External subset name: " .. name)
  if external_id ~= nil then
    print("External subset external id: " .. external_id)
  end
  if system_id ~= nil then
    print("External subset system id: " .. system_id)
  end
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

External subset name: html
External subset external id: -//W3C//DTD XHTML 1.0 Transitional//EN
External subset system id: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

reference

以下のようにコールバック関数を登録できます。

local parser = xmlua.XMLSAXParser.new()
parser.reference = function(entity_name)
  -- 実行したいコード
end

参照をパースしたときに、登録した関数が呼び出されます。

以下の例だと、&ref;をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
  <!ENTITY ref "Reference">
]>
<test>&ref;</test>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.reference = function(entity_name)
  print("Reference entity name: " .. entity_name)
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Reference entity name: ref

processing_instruction

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、Processing instruction要素の属性を取得することができます。Processing Instruction要素の属性は、以下の例では、targetdata_listです。

local parser = xmlua.XMLSAXParser.new()
parser.processing_instruction = function(target, data_list)
  -- 実行したいコード
end

Processing Instruction要素が解析されたときに、登録したコールバック関数が呼び出されます。

以下の例では、<?target This is PI>をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- XML to be parsed
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet href="www.test.com/test-style.xsl" type="text/xsl" ?>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.processing_instruction = function(target, data_list)
  print("Processing instruction target: "..target)
  print("Processing instruction data: "..data_list)
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Processing instruction target: target
Processing instruction data: This is PI

cdata_block

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、CDATAセクション内の文字列を取得できます。以下の例では、CDATAセクション内の文字列は、cdata_blockです。

local parser = xmlua.XMLSAXParser.new()
parser.cdata_block = function(cdata_block)
  -- 実行したいコード
end

CDATAセクションをパースしたときに、登録した関数が呼び出されます。

以下の例だと、<![CDATA[<p>Hello world!</p>]]>をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [=[
<?xml version="1.0" encoding="UTF-8" ?>
<xml>
<![CDATA[<p>Hello world!</p>]]>
</xml>
]=]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.cdata_block = function(cdata_block)
  print("CDATA block: "..cdata_block)
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

CDATA block: <p>Hello world!</p>

ignorable_whitespace

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、XML内の無視できる空白を取得することができます。以下の例では、無視できる空白は、ignorable_whitespaceです。

local parser = xmlua.XMLSAXParser.new()
parser.ignorable_whitespace = function(ignorable_whitespace)
  -- 実行したいコード
end

無視できる空白をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<xml>
  <test></test>
</xml>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.ignorable_whitespace = function(ignorable_whitespace)
  print("Ignorable whitespace: ".."\""..ignorable_whitespace.."\"")
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Ignorable whitespace: "
  "
Ignorable whitespace: "
"

comment

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、XML内のコメントを取得できます。以下の例では、commentがXML内のコメントです。

local parser = xmlua.XMLSAXParser.new()
parser.comment = function(comment)
  -- 実行したいコード
end

XMLのコメントをパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<xml><!--This is comment--></xml>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.comment = function(comment)
  print("Comment: "..comment)
end
local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Comment:  This is comment.

start_element

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、要素の名前と属性を取得できます。

local parser = xmlua.XMLSAXParser.new()
parser.start_element = function(local_name,
                                prefix,
                                uri,
                                namespaces,
                                attributes)
  -- You want to execute code
end

要素をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- XML to be parsed
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
  id="top"
  xhtml:class="top-level">
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- Parses XML with SAX
local parser = xmlua.XMLSAXParser.new()
parser.start_element = function(local_name,
                                prefix,
                                uri,
                                namespaces,
                                attributes)
  print("Start element: " .. local_name)
  if prefix then
    print("  prefix: " .. prefix)
  end
  if uri then
    print("  URI: " .. uri)
  end
  for namespace_prefix, namespace_uri in pairs(namespaces) do
    if namespace_prefix  == "" then
      print("  Default namespace: " .. namespace_uri)
    else
      print("  Namespace: " .. namespace_prefix .. ": " .. namespace_uri)
    end
  end
  if attributes then
    if #attributes > 0 then
      print("  Attributes:")
      for i, attribute in pairs(attributes) do
        local name
        if attribute.prefix then
          name = attribute.prefix .. ":" .. attribute.local_name
        else
          name = attribute.local_name
        end
        if attribute.uri then
          name = name .. "{" .. attribute.uri .. "}"
        end
        print("    " .. name .. ": " .. attribute.value)
      end
    end
  end
end

local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Start element: html
  prefix: xhtml
  URI: http://www.w3.org/1999/xhtml
  Namespace: xhtml: http://www.w3.org/1999/xhtml
  Attributes:
    id: top
    xhtml:class{http://www.w3.org/1999/xhtml}: top-level

end_element

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、要素の名前を取得できます。

local parser = xmlua.XMLSAXParser.new()
parser.end_element = function(local_name,
                              prefix,
                              uri)
  -- You want to execute code
end

要素の終わりをパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- XML to be parsed
local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml">
</xhtml:html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- Parses XML with SAX
local parser = xmlua.XMLSAXParser.new()
parser.end_element = function(name)
  print("End element: " .. local_name)
  if prefix then
    print("  prefix: " .. prefix)
  end
  if uri then
    print("  URI: " .. uri)
  end
end

local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

End element: html
  prefix: xhtml
  URI: http://www.w3.org/1999/xhtml

text

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、text要素の値を取得できます。

local parser = xmlua.XMLSAXParser.new()
parser.text = function(text)
  -- 実行したいコード
end

text要素をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パースするXML
local xml = [[
<?xml version="1.0" encoding="UTF-8"?>
<book>
  <title>Hello World</title>
</book>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- Parses XML with SAX
local parser = xmlua.XMLSAXParser.new()
parser.text = function(text)
  print("Text: " .. text)
end

local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Text:   
Text: Hello World

warning

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、警告メッセージを取得できます。

local parser = xmlua.XMLSAXParser.new()
parser.warning = function(message)
  -- 実行したいコード
end

登録した関数は、xmlの解析中に警告が発生した時に呼ばれます。

例:

local xmlua = require("xmlua")

-- パースするXML
  local xml = [[
<?xml version="1.0"?>
<?xmlo ?>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.warning = function(message)
  print("Warning message: " .. message)
end

local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

"xmlParsePITarget: invalid name prefix 'xml'\n"

いくつかの警告は、xmlParserCtxt.pedanticが有効なときのみ出力されます。これらの警告を出力するためには、is_pedanticを以下のように使用します。

parser.is_pedantic = true

例:

local xmlua = require("xmlua")

-- パースするXML
  local xml = [[
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root SYSTEM "file:///usr/local/share/test.dtd" [
<!ENTITY test "This is test.">
<!ENTITY test "This is test.">
]>
<root>
       <data>&test;</data>
</root>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- SAXを使ってXMLをパースする。
local parser = xmlua.XMLSAXParser.new()
parser.is_pedantic = true
parser.warning = function(message)
  print("Warning message: " .. message)
  print("Pedantic :", parser.is_pedantic)
end

local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Warning message: Entity(test) already defined in the internal subset
Pedantic :	true

error

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、エラー情報を取得できます。

local parser = xmlua.XMLSAXParser.new()
parser.error = function(error)
  -- 実行したいコード
end

パースが失敗したときに、登録した関数が呼び出されます。エラー情報の構造は以下の通りです。

{
  domain
  code
  message
  level
  line
}

domainの値は、Error domain 一覧に定義されています。

codeの値は、Error code 一覧に定義されています。

levelの値は、Error level 一覧に定義されています。

例:

local xmlua = require("xmlua")

-- XML to be parsed
local xml = [[
<>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local xml = io.open("example.xml"):read("*all")

-- Parses XML with SAX
local parser = xmlua.XMLSAXParser.new()
parser.error = function(error)
  print("Error domain : " .. error.domain)
  print("Error code   : " .. error.code)
  print("Error message: " .. error.message)
  print("Error level  : " .. error.level)
  print("Error line   : " .. error.line)
end

local success = parser:parse(xml)
if not success then
  print("Failed to parse XML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Error domain :	1
Error code :	5
Error message :Extra content at the end of the document

Error level :	3
Error line :	1
Failed to parse XML with SAX