ymXML - Simple XML Parser ユーザーガイド

Apr 1, 2004
Nov 24, 2005 改訂
yoshidam (Yoshida Masato)
<yoshidam@yoshidam.net>

概要

Ruby で書かれた簡単な XML パーサです。

以下の特徴があります。

以下の機能は実装されていません。

また,整形式制約のチェックは完全ではありません。

インストール

現在の最新版は <URL:http://www.yoshidam.net/Ruby_ja.html#ymXML> です。

インストーラはありません。 ymxml.rb を適当にインストールしてください。

使い方

準備

ymXML は Ruby 1.8,および 1.6 に対応していますが, Ruby 1.8.1 以降での使用をお勧めします。

日本語 EUC,Shift_JIS の XML ファイルを扱うには uconv ライブラリもインストールされている必要があります。

簡単な使いかた

ymXML ライブラリを使うときは以下の require 文が必要です。

require 'ymxml'

YmXML::Parser.new でインスタンスを作成し, parse メソッドでパースを開始します。 parse の引数として YmXML::InputStream オブジェクトを渡します。 ファイル名を渡すときは YmXML::InputStream.openFile を, URI を渡すときは YmXML::InputStream.openURI を使います。 また,UTF-8 の文字列ならば parse に直接渡すこともできます。

parser = YMXML::Parser.new
stream = YmXML::InputStream.openFile('test.xml')
parser.parse(stream)

上記の例では text.xml をパースします。 イベントハンドラがないため,構文チェックのみを行い, エラーを見付けると YmXML::ParseError 例外で報告します。

ymXML は XMLParser と同様,パース結果をイベントとして報告します。 イベントモデルはほぼ XMLParser (Expat) と同じです。 XML ファイルの文字符号化にかかわらず,パース結果は常に UTF-8 に変換されます。

アプリケーションがパース結果を得る方法として, XMLParser と同様,イベントハンドラを定義する方法とイテレータとして使う方法があります。

イベントハンドラ

イベントハンドラを使う場合,基本的に YmXML::Parser クラスを継承し, イベントハンドラメソッドを定義して使ってください。 YmXML::Parser クラスのインスタンスに特異メソッドを定義しても構いません。 イベントハンドラ名,引数の詳細についてはリファレンスを参照してください。

class MyParser < YmXML::Parser
  def startElement(name, attrs)
    puts "startElement: #{name} #{attrs.inspect}"
  end

  def endElement(name)
    puts "endElement: #{name}"
  end

  def character(data)
    puts "character: #{data.inspect}"
  end
end

parser = MyParser.new
parser.parse(YmXML::InputStream.openURI('http://www.yoshidam.net/index.xml'))

イベントハンドラを使う方法は XMLParser との互換のために存在します。 YmXML::Parser クラスと派生クラスの間でインスタンス変数の衝突などの副作用の起きる可能性があるため, イベントハンドラの使用はあまりお勧めではありません。

イテレータ

イテレータとして使う方法は, より Ruby らしい(と思われる)やりかたです。 ブロックを使って繰り返し構文と同様に記述することができます。

YmXML::Parser#parse メソッドにブロックを渡すことでイテレータモードで動作するようになります。 イテレータモードではたとえイベントハンドラを定義していても無視されます。 イテレータはイベントタイプ,(主に)名称, (主に)データ,パーサオブジェクトという 4 つの変数をブロックに渡します。 イベントタイプはイベント名のシンボルです。 名称,データの意味はイベントによって異なります。 パーサオブジェクトはイベントを発生させたオブジェクトです。 通常はレシーバそのものですが,実体パース中は実体用のパーサオブジェクトを返します。

parser = YmXML::Parser.new
stream = YMXML::InputStream.openURI('http://www.yoshidam.net/index.xml')
parser.parse(stream) do |etype, name, data, currentParser|
  case etype
  when :START_ELEM
    puts "startElement: #{name} #{data.inspect}"
  when :END_ELEM
    puts "endElement: #{name}"
  when :CDATA
    puts "character: #{data.inspect}"
  end
end

イテレータモードの応用としてリスナオブジェクトを渡す方法があります。 リスナオブジェクトに対してイベントハンドラを定義します。 リスナオブジェクトは YmXML::Listener モジュールをインクルードし, listen メソッドの返値に & をつけてイテレータに渡してください。 イベントハンドラ内でパーサオブジェクトを得たい場合は YmXML::Listener#currentParser メソッドを使うことができます。

class MyListener
  include YmXML::Listener

  def startElement(name, attrs)
    puts "startElement: #{name} #{attrs.inspect}"
  end

  def endElement(name)
    puts "endElement: #{name}"
  end

  def character(data)
    puts "character: #{data.inspect}"
  end
end

parser = YmXML::Parser.new
listener = MyListener.new
stream = YMXML::InputStream.openURI('http://www.yoshidam.net/index.xml')
parser.parse(stream, &listener.listen)

文字符号化

入力文字符号化は UTF-8, UTF-16 などに対応しています。 uconv ライブラリがインストールされていると EUC-JP, Shift_JIS, ISO-2022-JP も使うことができます。

YmXML::InputStream を拡張することでその他の文字符号化に対応することもできます。 YmXML::InputStream の拡張には YmXML::InputStream.new にブロックを与える方法と YmXML::InputStream#unknownEncoding をオーバーライドする方法があります。

YmXML::InputStream.new にブロックを与える場合,以下のようになります。 encoding は常に小文字になります。 変換できない場合は例外を発生してください。

stream = YmXML::InputStream.openURI('...') do |encoding, content|
  case encoding
  when "euc-kr"
    Iconv.iconv("UTF-8", "EUC-KR", content)[0]
  else
    raise YmXML::EncodingError.new("unknown encoding: #{encoding}")
  end
end

YmXML::InputStream#unknownEncoding のオーバーライドは以下のようになります。 encoding は常に小文字になります。 変換できない場合は super を呼び出してください。

class MyInputStream < YmXML::InputStream
  require 'iconv'
  def unknownEncoding(encoding, content)
    case encoding
    when "euc-kr"
      return Iconv.iconv("UTF-8", "EUC-KR", content)[0]
    end
    super
  end
end

EBCDIC などの ASCII 互換でない文字符号化の場合, YmXML::InputStream を拡張し, さらに YmXML::InputStream.openURI 等で encoding 引数を指定してください。

名前空間

ymXML は名前空間をサポートします。 YmXML::Parser.new の第二引数 nssep に nil 以外の文字列を渡すと, パーサが名前空間対応モードで動作するようになります。

名前空間対応モードでは START_NAMESPACE_DECL, END_NAMESPACE_DECL イベントが発生します。 また,要素名,属性名が名前空間 URI, ローカル名, 名前空間プレフィックスを nssep で連結した名前になります。 これは XMLParser で setReturnNSTriplet(true) の場合と同じ動作です。

xml = "
  <test xmlns:ns1='http://www.yoshidam.net/ns/ns1'>
    <ns1:aa/>
  </text>"
YmXML::Parser.new(nil, '|').parse(xml) do |etype, name, data, currentParser|
  case etype
  when :START_ELEM
    p [etype, name]
  when :START_NAMESPACE_DECL,:END_NAMESPACE_DECL
    p [etype, name, data]
  end
end

上記コードの実行結果は以下のようになります。

[:START_NAMESPACE_DECL, "ns1", "http://www.yoshidam.net/ns/ns1"]
[:START_NAMESPACE_DECL, nil, nil]
[:START_ELEM, "|test|"]
[:START_ELEM, "http://www.yoshidam.net/ns/ns1|aa|ns1"]
[:END_NAMESPACE_DECL, nil, nil]
[:END_NAMESPACE_DECL, "ns1", nil]

name.split(nssep,3) 等で分割することもできます。 URI と プレフィックスは空文字列になることがありますが, これは START_NAMESPACE_DECL のパラメータでの nil を意味していることに注意してください。

外部実体

ymXML は内部 DTD サブセットで宣言された外部解析対象実体のパースが可能です。

EXTERNAL_ENTITY_REF イベント内で YmXML::Parser#createChildParser メソッドで実体パーサを生成するか, YmXML::Parser#parseExternalEntity メソッドでパースしてください。 イテレータモードでは YmXML::Parser#parseExternalEntity メソッドしか使えません。

EXTERNAL_ENTITY_REF イベントで通知される base は YmXML::Parser#setBase で設定された URI ベースです。 外部解析対象実体をパースする場合は YmXML::Parser#setBase で正しい URI ベースを設定してください。 YmXML::InputStream#getURIBase メソッドを使って URI ベースを得ることもできます。

class MyParser < YmXML::Parser
  def startElement(name, attrs)
    puts "startElement: #{name} #{attrs.inspect}"
  end

  def endElement(name)
    puts "endElement: #{name}"
  end

  def character(data)
    puts "character: #{data.inspect}"
  end

  def externalEntityRef(context, base, systemId, publicId)
    stream = YmXML::InputStream.openURI(systemId, base)

    ## createChildParser を使う場合
    # cp = createChildParser(context)
    # cp.setBase(stream.getURIBase)
    # cp.parse(stream)
    # cp.done

    ## parseExternalEntity を使う場合
    parseExternalEntity(context, stream)
  end
end

parser = MyParser.new
stream = YmXML::InputStream.openFile(ARGV[0])
parser.setBase(stream.getURIBase)
parser.parse(stream)

エラー処理

パースエラー(XML 仕様における致命的なエラー)が発見すると,例外を発生します。 文字符号化の変換に失敗した場合,YmXML::EncodingError, それ以外のエラーは YmXML::ParseError です。 また,YmXML::Parser#stop メソッドを呼び出した場合 YmXML::ParseStopped 例外が発生します。

YmXML::Parser#getContentURI でパース中の文書ファイル名(あるいは実体のファイル名)と およそのエラー位置を得ることができます。

begin
  p = YmXML::Parser.new
  p.parse(stream)
rescue YmXML::Error
  uri, l = p.getContentURI
  $stderr.puts "#{uri}(#{l}): #{$!}"
  $stderr.puts $!.backtrace.join("\n\tfrom ")
end

XML 1.1 対応

XML 1.1 に一部対応しています。

文書,実体の XML 宣言,テキスト宣言の version が "1.1" の時に XML 1.1 モードになります。 XML 宣言,テキスト宣言がない場合は XML 1.0 モードになります。 これは XML 1.1 の仕様上,正しい動作とは言えないことに注意してください。

Unicode の正規化チェックは行いません。

注意: XML 1.0 と XML 1.1 には互換性がありません。 特別な理由がない限り XML 1.1 は使うべきではありません。

リファレンス

YmXML::Parser クラス

XML パーサクラスです。

メソッド

XMLParser のクラスメソッドのうち, expatVersion, getFeatureList, およびインスタンスメソッドのうち defaultCurrent, column, byteIndex, byteCount, setParamEntityParsing, getInputContext, getIdAttribute, reset, useForeignDTD は対応するメソッドが存在しません。

YmXML::Parser.new(encoding = nil, nssep = nil)
文書をパースするためのパーサを生成します。
encoding で文字符号化を指定できます。 encoding を指定した場合,XML 宣言の文字符号化宣言を無視します。 省略,あるいは nil を指定した場合,XML 宣言に従います。 parse メソッドの stream 引数が YmXML::InputStream で, 文字符号化が指定されている場合はそちらのほうが優先されます。 stream が文字列の場合は encoding 指定は無視されます。
nssep に nil 以外の文字を指定すると,パーサは名前空間対応モードで動作します。 nssep は要素名,属性名の連結に使われるので, 名前文字,URI 文字の使用は避けてください。 TAB などの制御文字のような URI に使えない文字が安全です。
このメソッドの XMLParser との互換性は完全ではありません。 外部実体パース用のパーサは createChildParser で生成してください。
YmXML::Parser#parse(stream, &block)
stream をパースします。
stream は YmXML::InputStream オブジェクト,または UTF-8の文字列です。 ブロックを与えるとイテレータモードで動作します。
stream が文字列の場合は new の encoding 引数と XML 宣言 の encoding 宣言が無視されます。
デフォルトのイベントハンドラは何も行いません。 イテレータモードではイベントハンドラは呼び出されません。
イテレータモードでのブロック引数 etype はイベント種別を 表す Symbol オブジェクトです。 name,data の用途はイベント毎に異なります。 parser はパーサオブジェクトそのものです。 実体のパース中はパーサオブジェクトが実体パース用のパーサになっていることに注意してください。
etype の一覧,および name, data の組合せは以下のとおりです。 各イベントの詳細は対応するイベントハンドラの説明を参照してください。
etypenamedata
CDATAniltext
XML_DECLnil[version, encoding, standalone]
PInamedata
COMMENTnildata
START_ELEMnameattrs
END_ELEM namenil
START_NAMESPACE_DECLprefixuri
END_NAMESPACE_DECLprefixnil
ELEMENT_DECLnamemodel
ATTLIST_DECLelname[attname, att_type, dflt, isrequired]
NOTATION_DECLnotationName[base, systemId, publicId]
ENTITY_DECLentityName[isparameter_entity, value, base, systenId, publicId, notationName]
EXTERNAL_ENTITY_REFcontext[base, systemId, publicId]
SKIPPED_ENTITYnameisParameterEntity
START_CDATAnilnil
END_CDATAnilnil
START_DOCUMENTnilnil
END_DOCUMENTnilnil
このメソッドの XMLParser との互換性は完全ではありません。 stream として YmXML::InputStream を使うようにしてください。
YmXML::Parser#stop()
YmXML::ParseStopped 例外を発生してパースを停止します。
このメソッドは XMLParser には存在しません。
YmXML::Parser#done()
何も行いません。
このメソッドは XMLParser との互換のために存在します。
YmXML::Parser#createChildParser(context, encoding = nil, nssep = nil)
パース可能実体をパースするためのパーサを生成します。
外部実体の場合,context に externalEntityRef イベントの context 引数を, 内部実体の場合は nil を指定します。
デフォルトでは親パーサの nssep 引数,実体宣言,名前空間宣言,属性のデフォルト値, URI ベースが引き継がれます。
このメソッドは XMLParser には存在しません。
YmXML::Parser#parseExternalEntity(context, content)
親パーサのイベントハンドラを使って外部実体をパースします。
context は externalEntityRef ハンドラの context 引数を, context には YmXML::InputStream オブジェクトを指定します。
親パーサがイベントハンドラを持っているときはイベントをそちらに委譲し, イテレータブロックを持っているときはそれを呼び出します。
このメソッドは XMLParser には存在しません。
YmXML::Parser#setBase(base)
入力ストリームの URI ベースを与えます。
externalEntityRef などの base 引数として使われます。
このメソッドは XMLParser と互換性があります。
YmXML::Parser#getBase()
setBase で設定した URI ベースを得ます。
このメソッドは XMLParser には存在しません。
YmXML::Parser#getContentURI()
現在の文書ファイル名,あるいは実体ファイル名とパース位置の配列を得ます。
正確な位置は得られないこともあります。 入力がファイルではない場合,ファイル名は"-" になります。
このメソッドは XMLParser には存在しません。
YmXML::Parser#line()
現在のパース位置を得ます。
正確な位置は得られないこともあります。 実体パース中は実体内での位置が得られます。 getContentURI と同じ値になります。
このメソッドは XMLParser と結果が異なることがあります。
YmXML::Parser#getSpecifiedAttributes()
デフォルトの属性値ではない,陽に指定された属性名のリストを得ます。
startElement ハンドラ内,あるいは START_ELEM イベントの発生直後に呼び出してください。 それ以外の時は正しい結果が得られません。
属性の順序は XML 内での並び順になります。
このメソッドは XMLParser とほぼ互換性があります。
YmXML::Parser#setReturnNSTriplet(flag)
何も行いません。
このメソッドは XMLParser との互換のために存在します。 ymXML では常に ReturnNSTriplet モードで動作します。

イベントハンドラ

XMLParser のイベントのうち,UNPARSED_ENTITY_DECL,START_DOCTYPE_DECL, END_DOCTYPE_DECL,DEFAULT は存在しません。

YmXML::Parser#character(text)
CDATA イベントハンドラ。
内容テキスト,CDATA セクションを通知します。 text は内容オブジェクトの文字列です。 実体参照,CDATA セクションなどによって複数のイベントに分断されることがあります。
このイベントは XMLParser と互換性がありますが, イベントの分断のされ方が XMLParser と異なります。
YmXML::Parser#xmlDecl(version, encoding, standalone)
XML_DECL イベントハンドラ。
XML 宣言を通知します。テキスト宣言は通知されません。
version は XML のバージョンです。 "1.0" または "1.1" になります。 encoding は文字符号化宣言の値です。nil または文字エンコーディング名になります。 standalone はスタンドアロン文書宣言の値です。 指定無しは -1,yes が 1,no が 0 になります。
このイベントはテキスト宣言を通知しないこと以外は XMLParser と互換性があります。
YmXML::Parser#processingInstruction(name, data)
PI イベントハンドラ。
処理命令を通知します。
name は処理命令ターゲット,data は処理命令の内容です。
このイベントは XMLParser と互換性があります。
YmXML::Parser#comment(data)
COMMENT イベントハンドラ。
コメントを通知します。
data はコメントの内容です。
このイベントは XMLParser と互換性があります。
YmXML::Parser#startElement(name, attrs)
START_ELEM イベントハンドラ。
要素開始タグを通知します。
name は要素名,attrs は属性名をキーとするハッシュです。 名前空間対応モードでは要素名,属性名は YmXML::Parser.new の nssep 引数をセパレータとして, 名前空間 URI,ローカルパート,名前空間プレフィックスを連結したものとなります。
このイベントは名前空間対応モードで常に setReturnNSTriplet 状態であること以外は XMLParser と互換性があります。
YmXML::Parser#endElement(name)
END_ELEM イベントハンドラ。
要素終了タグを通知します。
name は要素名です。 名前空間対応モードでは要素名は YmXML::Parser.new の nssep 引数をセパレータとして, 名前空間 URI,ローカルパート,名前空間プレフィックスを連結したものとなります。
このイベントは名前空間対応モードで常に setReturnNSTriplet 状態であること以外は XMLParser と互換性があります。
YmXML::Parser#startNamespaceDecl(prefix, uri)
START_NAMESPACE_DECL イベントハンドラ。
名前空間宣言の開始を通知します。
prefix は名前空間プレフィックスです。 デフォルト名前空間の場合は nil になります。
uri は名前空間 URI です。 xmlns="" でデフォルト名前空間を無効にした場合は nil になります。
XML 1.1 ではデフォルト以外の名前空間も無効化され, uri が nil になることがあります。
このイベントは XML 1.1 対応以外は XMLParser と互換性があります。
YmXML::Parser#endNamespaceDecl(prefix)
END_NAMESPACE_DECL イベントハンドラ。
名前空間宣言の終了を通知します。
prefix は名前空間プレフィックスです。 デフォルト名前空間の場合は nil になります。
このイベントは XMLParser と互換性があります。
YmXML::Parser#elementDecl(name, model)
ELEMENT_DECL イベントハンドラ。
要素型宣言を通知します。
name は要素名,model は 内容モデルをあらわす [type, quant, name, [children_model, ...]] のような配列です。type は "EMPTY","ANY","MIXED", "CHOICE","SEQ" のいずれか,quantは "","?","*","+" のいずれかです。name は nil か要素名,children_model は子モデルです。
このイベントは XMLParser と互換性があります。
YmXML::Parser#attlistDecl(elname, attname, att_type, dflt, isrequired)
ATTLIST_DECL イベントハンドラ。
属性リスト宣言を通知します。
elname は要素名,attname は属性名,att_type は属性の型,dflt は省略値, isrequired は #REQUIRED かどうかをあらわします。 dflt は nil になることがあります。
同じ要素名,属性名の属性リスト宣言は最初の宣言だけが有効であり, それ以外の宣言では ATTLIST_DECL イベントは発生しません。 スタンドアロン文書でない場合はパラメタ実体参照以降の属性リスト宣言は無効であり, ATTLIST_DECL イベントは発生しません。
<?xml version="1.0" standalone="no?>
<!DOCTYPE test [
<!ATTLIST test attr1 CDATA "ATTR1"
               attr2 CDATA "ATTR2">
<!ATTLIST test attr1 CDATA "ATTR1a"
               attr3 CDATA "ATTR3">
%PE;
<!ATTLIST test attr4 CDATA "ATTR4"
               attr5 CDATA "ATTR5">
]>
上記属性リスト宣言では以下のイベントが発生します。
elnameattrnamedflt
testattr1ATTR1
testattr2ATTR2
testattr3ATTR3
このイベントは XMLParser と互換性があります。
YmXML::Parser#notationDecl(notationName, base, systemId, publicId)
NOTATION_DECL イベントハンドラ。
記法宣言を通知します。
notationName は記法名, base は setBase で設定された URI ベース, systemId はシステム識別子,publicId は公開識別子です。 URI ベース,システム識別子,公開識別子は nil になることがあります。
このイベントは XMLParser と互換性があります。
YmXML::Parser#entityDecl(entityName, isparameter_entity, value, base, systenId, publicId, notationName)
ENTITY_DECL イベントハンドラ。
実体宣言を通知します。
entityName は実体名, isparameter_entity はパラメタ実体かどうか, value は実体値,base は setBase で設定された URI ベース, systemId はシステム識別子,publicId は公開識別子, notationName は記法名です。
内部実体の場合,value が非 nil, systemId, publicId, notationName が nil になります。 外部実体の場合,value は nil で, systemId, publicId は nil になることがあります。 notationName が非 nil の場合,この実体は解析対象外実体です。
同じ名前の実体宣言は最初の宣言だけが有効であり, それ以外の宣言では ENTITY_DECL イベントは発生しません。 またスタンドアロン文書でない場合はパラメタ実体参照以降の実体宣言は無効であり,ENTITY_DECL イベントは発生しません。
このイベントは XMLParser と互換性があります。
YmXML::Parser#externalEntityRef(context, base, systemId, publicId)
EXTERNAL_ENTITY_REF イベントハンドラ。
外部実体参照を通知します。
context は外部実体パーサに渡すためのパラメータ, base は setBase で設定された URI ベース, systemId はシステム識別子, publicId は公開識別子です。 base, systemId, publicId は nil になることがあります。
このイベントはパラメタ実体参照を通知しないことの除いて XMLParser と互換性があります。
YmXML::Parser#skippedEntity(name, isParameterEntity)
SKIPPED_ENTITY イベントハンドラ。
未定義の実体参照をスキップしたことを通知します。 name はスキップされた実体名です。 isParameterEntity は常に false です。
文書型宣言がない,または文書型宣言がパラメタ実体参照を含まない内部サブセットのみ, またはスタンドアロン文書である場合は未定義の実体参照は整形式制約違反なので例外が発生し, SKIPPED_ENTITY イベントは発生しません。
SKIPPED_ENTITY イベントが発生するのは内容テキスト内の実体参照のみで, 属性リスト宣言内や属性値内の実体参照では発生しません。
このイベントはパラメタ実体のスキップを通知しないため,XMLParser と互換性が不完全です。 また, XMLParser では default ハンドラを定義すると実体参照の展開が抑制され, このイベントが発生しますが,ymXML では実体参照は常に展開されます。
YmXML::Parser#startCdata()
START_CDATA イベントハンドラ。
CDATA セクションの開始を通知します。
このイベントは XMLParser と互換性があります。
YmXML::Parser#endCdata()
END_CDATA イベントハンドラ。
CDATA セクションの終了を通知します。
このイベントは XMLParser と互換性があります。
YmXML::Parser#startDocument()
START_DOCUMENT イベントハンドラ。
文書のパース開始を通知します。
このイベントは XMLParser にはありません。
YmXML::Parser#endDocument()
END_DOCUMENT イベントハンドラ。
文書のパース終了を通知します。 ParseError 例外が発生した場合は通知されません。
このイベントは XMLParser にはありません。

YmXML::Listener モジュール

イテレータモード用のリスナオブジェクトを作るためのモジュールです。 YmXML::Parser のイベントハンドラと同じメソッドが使えます。

メソッド

YmXML::Listener#listen()
リスナのメソッドオブジェクトを得ます。
YmXML::Parser#parse メソッドに第二引数として渡すことができます。
class MyListener
  include YmXML::Listener
end

listner = MyListener.new
YMXML::Parser.new.parse(file, &listener.listen)
YmXML::Listener#currentParser()
現在パースしている YmXML::Parser オブジェクトを得ます。
イベントハンドラ内で呼び出してください。

YmXML::InputStream クラス

入力 XML ファイルを管理するためのクラスです。

メソッド

YmXML::InputStream.new(stream, encoding = nil, &block)
YmXML::InputStream.openFile(file, encoding = nil, &block)
YmXML::InputStream.openURI(uri, base = nil, encoding = nil, &block)
InputStream オブジェクトを生成します。
new は IO オブジェクト,openFile はファイル名, openURI は URI を指定します。 openURI の場合,URI ベースと相対 URI を与えることもできます。 encoding は文字符号化を陽に指定します。 block を与えることで対応文字符号化の拡張を行うことができます。
YmXML::InputStream.setURIResolver(cmd)
openURI で使用される URI 解決コマンドを指定します。
Ruby 1.8 では通常,open-uri ライブラリが使われます。 open-uri ライブラリがない場合は /usr/bin/curl コマンドが呼び出されます。
引数に URI を取り,IO オブジェクトを返す Proc オブジェクト, または http, https, ftp, file プロトコルを解決できるコマンド名を指定してください。
以下に例を示します。
YmXML::InputStream.setURIResolver(proc {|uri| open(uri) })
YmXML::InputStream.setURIResolver("wget -O - -o /dev/null")
YmXML::InputStream#setURI(uri)
URI を設定します。
new や openFile で生成した InputStream オブジェクトに URI を設定する場合に使うことができます。 getURI, getURIBase などに影響を与えます。
YmXML::InputStream#getURI()
オブジェク生成時,あるいは settURI で設定した URI,またはファイル名を得ます。
YmXML::InputStream#getURIBase()
オブジェク生成時,あるいは settURI で設定した URI,ファイル名 の URI ベース,またはファイルパスを得ます。
YmXML::InputStream#unknownEncoding(encoding, content)
UTF-8, UTF-16, UTF-16LE/BE, UTF-32, UTF-32LE/BE 以外の文字符号化を検出したときに呼び出されるイベントハンドラです。
encoding は指定された文字符号化名, content は XML ファイルの全ての内容です。 encoding は小文字に正規化されています。
このメソッドをオーバーライドすることで,対応文字符号化の拡張を行うことができます。 デフォルトでは iso-8859-1, euc-jp/shift_jis (uconv ライブラリが必要), iso-2022-jp (uconv, nkf ライブラリが必要) に対応しています。

バグなど

以下の点で XML 1.0 仕様の non-validating プロセッサに適合しません。

ruby-1.6 では正規表現の互換性の問題で,文字クラスチェックが正常に動作しません。 ruby-1.8 以降での使用をお勧めします。

権利

本ライブラリの著作権は吉田正人が保持します。

本ライブラリは,Ruby ライセンスにしたがって利用することができます。

作者

吉田正人 <yoshidam@yoshidam.net>

履歴

  Nov 24, 2005 version 0.5.1 パラメタ実体対応
  Apr  1, 2004 version 0.4.7 ユーザーガイド公開
  Feb  5, 2004 version 0.4.0 XML 1.1 対応など
  Mar 25, 2003 version 0.3.0 namespace 対応,DTD 対応など
  Mar 14, 2003 version 0.2.1 開発再開
  Jan  7, 1999 version 0.2   Ruby で書き直し
  Apr 10, 1998 version 0.1   Perl 版

Last modified: Fri Jan 28 22:10:16 JST 2011