Show page source of howto/use #68734

[[PageOutline]]

= 使い方 =

== 基礎的な知識 ==

全てのユーティリティーは、対応するクラスのヘッダーファイルをインクルードして使います。

{{{
// XMLCh2Transcoder クラスを利用する場合
#include <xercesc_utils/XMLCh2Transcoder.hpp>
}}}

また、全てのクラスは xercesc_utils 名前空間に定義されています。

名前空間を指定した完全修飾名で利用するか、using namespace を利用してください。

=== 完全修飾名を利用した場合 ===

{{{
#include <xercesc_utils/XMLCh2CharTranscoder.hpp>

class SampleHandler : public xercesc::DefaultHandler {
private:
    xercesc_utils::XMLCh2CharTranscoder transcoder_;

...
}}}

=== using namespace を利用した場合 ===

{{{
#include <xercesc_utils/XMLCh2CharTranscoder.hpp>
using namespace xercesc_utils;

class SampleHandler : public xercesc::DefaultHandler {
private:
    XMLCh2CharTranscoder transcoder_;

...
}
}}}

=== メモ: 完全修飾名と using namespace の使い分けについて ===

使い分けとしては、インクルードファイルでは完全修飾名を使用し、ソースファイルでは using namespace を利用するのがスタンダードだと思います。

理由はインクルードファイルで using namespace を使用してしまうと、そのインクルードファイルをインクルードした全てのファイルに using namespace が強制的に適用されてしまうからです。

インクルードファイルの中でも using namespace のスコープを限定すればこの限りではありません。

----

== XMLCh2CharTranscoder クラス ==

Xerces C++ の文字列型(XMLCh*)から C++ 標準の文字列型 char* へのエンコード指定文字列変換をサポートします。

使い方は以下の通りです。

{{{
#include <xercesc_utils/XMLCh2CharTranscoder.hpp>
using namespace xercesc_utils;

// SAX の xercesc::DefaultHandler の startElement メソッドの例
void SampleHandler::startElement(const XMLCh* const uri, const XMLCh* const localname,
                                 const XMLCh* const qname, const Attributes& attrs) {
    XMLCh2CharTranscoder transcoder("Shift_JIS");
    cout << "start  : " << transcoder.transcode(localname) << endl;
}
}}}

コンストラクタで指定する文字コードは、変換後に期待する文字コードです。

上の例では XML ドキュメントの任意の文字コードの文字列を Shift_JIS の文字列型 char* 文字列に変換しています。

----

=== メモ: 文字列のメモリ管理 ===

XMLCh2CharTranscoder の transcode メソッドは、xercesc_utils::CharPtr 型の文字列を返します。

xercesc_utils::CharPtr 型は、char* をラッピングしたクラスです。

xercesc_utils::CharPtr 型は、char* と同様の扱いができますが、メモリの管理を自分で行ってくれます。

本来、動的に生成した char* 文字列はメモリの解放である delete を自分で行う必要がありますが、xercesc_utils::CharPtr が行ってくれるため開発者はメモリ管理に気を使う必要はありません。

char* 文字列のメモリの有効範囲は、xercesc_utils::CharPtr の変数のスコープと同一です。

----