• Showing Page History #68736
  • Showing Page History #69447
  • Showing Page History #68735

使い方(version 1.00)

基礎的な知識

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

// 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* 文字列に変換しています。

XML 要素の名前や属性値や要素内テキストなど、日本語を含むテキストを取得する際に使用します。


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

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

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

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

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

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


メモ: 実際にする場合

事例としてはメソッド内で XMLCh2Transcoder クラスのインスタンスを作成しました。

事例の場合、メソッドが呼び出される毎にインスタンスの生成と破棄が行われますが、文字コードは基本的に1つのプログラム内では統一的に利用するはずです。

そのため実際の例ではクラスのメンバにする等、より広いスコープで定義し利用することが望ましいと言えます。

ただし、グローバルスコープで定義する場合は注意が必要です。

Xerces-C++ の初期化メソッドである XMLPlatformUtils::Initialize() を呼び出すまでは XMLCh2Transcoder クラスのインスタンスを作ることはできません。

これを回避するために以下のようなグローバルスコープ用のファクトリメソッドを作りましょう。

XMLCh2Transcoder& getGlobalTranscoder() {
    XMLCh2Transcoder transcoder("UTF-8");

    return transcoder;
}