Xerces/Xalan-C++ で XML

Xalan-C++ と Xerces-C++の連携

最終更新: 2015-04-01 (水) 20:35:08 (1358d)

概要

このページで説明するコード

連携させる

Xalan-C++ を使った XSLT プロセッサによる文章変換と、Xerces-C++ を使った文章の解析という一連の操作を ファイルを介すことなく一つのプログラム内で実現したい場合がある。 そんなときには、strtream クラスと MemBufInputSource クラスを使う。 strtream クラスと MemBufInputSource クラスを使った Xalan-C++ と Xerces-C++ の連携プログラムとして filemain.cpp の一部を以下に示す。

int main() {
  // Xerces & Xalan-C++を初期化する
  try {
    XMLPlatformUtils::Initialize();
    XalanTransformer::initialize();
  } catch(...) {
    cerr << "Xerces & Xalan-C++の初期化に失敗しました。" << endl;
    return 1;
  }

  SAX2XMLReader* parser=XMLReaderFactory::createXMLReader();

  try {
    // 文章を変換する
    XalanTransformer transformer;
    strstream stream;
    transformer.transform("example.xml", "example.xsl", stream);
    stream << '\0';
    string buffer=stream.str();

    SampleHandler handler;
    MemBufInputSource source((const XMLByte*)buffer.c_str(), buffer.length(), "memory_buffer");
    parser->setContentHandler(&handler);
    parser->parse(source);
  } catch(...) {
    cerr << "ファイルの解析に失敗しました。" << endl;
  }

  delete parser;

  XalanTransformer::terminate();
  XMLPlatformUtils::Terminate();

  return 0;
}

以上のプログラムの詳細は、SAXで単純なプログラミングXSLT の単純なプログラミングを参照のこと。 重要なのは、XalanTransformer::transform メソッドの第三引数として、strstream を指定していることである。 こうすることでドキュメントの変換結果が内部バッファに蓄積される。 そして、次に MemBufInputSource を使って SAX2XMLReader へと変換結果を渡す。 こうすることで Xalan-C++ と Xerces-C++ の連携を実現できる。

コメント

最新の10件を表示しています。 コメントページを参照

  • 試していませんが、Microsoft Visual C++ 2010 では動作しない可能性大です。 -- トゥイー 2011-10-25 (火) 09:08:35
お名前: