[ruby-list:46164] libxml で検証結果を取り出すには

View: New views
5 Messages — Rating Filter:   Alert me  

[ruby-list:46164] libxml で検証結果を取り出すには

by 5.5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

5.5 です。

libxml-ruby を使って XML 文書の検証結果を Logger オブジェクトに
記録しようとしたのですが,やり方が分かりませんでした。

まず,以下のスクリプトで,エラーメッセージがどのように出力される
か確かめます。

----
require 'rubygems'
gem 'libxml-ruby'
require 'libxml'

doc=LibXML::XML::Document.string "<root><foo /></root>"
dtd=LibXML::XML::Dtd.new "<!ELEMENT root (#PCDATA)>"

$stderr=open("stderr.txt", "w")
foo=open("foo.txt", "w")

begin
  doc.validate dtd
rescue
  foo.puts $!
end
----

コンソールには,期待どおり以下の二つのエラーが表示されました。

Error: Element root was declared #PCDATA but contains non text nodes at :1.
Error: No declaration for element foo at :1.

標準出力ではなくて標準エラー出力に書き出されました。
stderr.txt には何も書き出されません。
ということは,LibXML::XML::Document#validate メソッドは $stderr を
参照してないということですよね。
foo.txt には,

Error: No declaration for element foo at :1.

のみが書き出されます。

これでは検証結果を文字列として取得することができなさそうなのですが,
どうすればよいでしょうか?

--
5.5@...


[ruby-list:46172] Re: libxml で検証結果を取り出すには

by Kazuhiro NISHIYAMA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

西山和広です。

At Sun, 5 Jul 2009 21:57:14 +0900,
5.5 wrote:
>
> これでは検証結果を文字列として取得することができなさそうなのですが,
> どうすればよいでしょうか?

ファイルに書き込まれればいいのなら、 $stderr を変更するのではなく
STDERR.reopen("stderr.txt", "w")
のように標準エラー出力をファイルに向けるという方法でどうでしょうか。


$stderr と STDERR の違いは
http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html#a.24stdin
http://doc.okkez.net/187/view/method/Kernel/v/stderr
などにちょっと書いてあります。


--
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)


[ruby-list:46173] Re: libxml で検証結果を取り出すには

by 5.5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

5.5 です。

西山和広さん:
> ファイルに書き込まれればいいのなら、 $stderr を変更するのではなく
> STDERR.reopen("stderr.txt", "w")
> のように標準エラー出力をファイルに向けるという方法でどうでしょうか。

IO#reopen を使ったことが無かったのですが,そのように使える
のですね。

最終的にやりたいことは,Logger オブジェクトに記録することな
のですが,とりあえず libxml のエラーを好きなところに書き出
すことができそうです。
StringIO に取り込めば好きなように文字列操作できるのか…。

いま手許に実験できる環境がないので,明日やってみます。

ありがとうございました。

> $stderr と STDERR の違いは
> http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html#a.24stdin
> http://doc.okkez.net/187/view/method/Kernel/v/stderr
> などにちょっと書いてあります。

上記からたどった
http://doc.okkez.net/187/view/method/Kernel/c/STDERR
に少し書いてありました。

--
5.5@...


[ruby-list:46177] Re: libxml で検証結果を取り出すには

by OHARA Shigeki :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

大原と言います。

From: "5.5" <5.5@...>
Subject: [ruby-list:46164] libxml で検証結果を取り出すには
Message-ID: <4A50A326.5050705@...>
Date: Sun, 5 Jul 2009 21:57:14 +0900

> libxml-ruby を使って XML 文書の検証結果を Logger オブジェクトに
> 記録しようとしたのですが,やり方が分かりませんでした。
>
> まず,以下のスクリプトで,エラーメッセージがどのように出力される
> か確かめます。

LibXML では LibXML::XML::Error#set_handler メソッドで
エラーハンドリング用の処理を登録することができるようになっています。

  http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Error.html

デフォルトでは、エラーを STDERR に出力するメソッドが登録されていますが、
これを set_handler で所望の処理を行うように登録してやると良いと思います。


Logger = File.open("validate.log", "a+")

doc=LibXML::XML::Document.string "<root><foo /></root>"
dtd=LibXML::XML::Dtd.new "<!ELEMENT root (#PCDATA)>"

begin
  LibXML::XML::Error.set_handler { |error|
    Logger.puts error.message
  }
  doc.validate(dtd)
rescue => e
  puts e
end

----
OHARA Shigeki (大原 重樹) <os@...>


[ruby-list:46180] Re: libxml で検証結果を取り出すには

by 5.5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

5.5 です。

大原さん:
OHARA Shigeki さんは書きました:
> LibXML では LibXML::XML::Error#set_handler メソッドで
> エラーハンドリング用の処理を登録することができるようになっています。
>
>   http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Error.html
>
> デフォルトでは、エラーを STDERR に出力するメソッドが登録されていますが、
> これを set_handler で所望の処理を行うように登録してやると良いと思います。

おお! こんなメソッドがあるのですね。
これで,やりたかったことがバッチリできました。
ありがとうございました。

ドキュメントをもっと読まなきゃダメですね…。

--
5.5@...