2005年11月11日金曜日

Xerces C++ Parser でistreamを読む

Xerces C++ Parserには、std:: istreamからXMLを入力するための機能がなかったので、Xalanのコードを参考に(こちらではistreamからの読み込みが実装されてい る)、istreamから読み出すクラス(BinInputStreamと、InputStreamの拡張)を作りました。

以下はソースの抜粋。注:このままではコンパイルは通りません。適宜修正してくださいね。
まぁ、結構簡単かも。最初から作っておいてくれればいいのに。。

class StdBinInputStream
: public XERCES_CPP_NAMESPACE::BinInputStream,
private NonCopyable
{
public:
StdBinInputStream(std::istream& inputStream)
: _istream(inputStream) {}
virtual ~StdBinInputStream() {}
virtual unsigned int curPos() const
{ return _istream.tellg(); }
virtual unsigned int readBytes
(XMLByte* const toFill,
const unsigned int maxToRead)
{
XERIAL_ASSERT(sizeof(XMLByte) == sizeof(char));
if(!_istream)
return 0;
_istream.read(reinterpret_cast(toFill), maxToRead);
return _istream.gcount();
}

private:
std::istream& _istream;
};

class IStreamInputSource
: public XERCES_CPP_NAMESPACE::InputSource
{
public:
IStreamInputSource
(std::istream& in,
XERCES_CPP_NAMESPACE::MemoryManager* const manager =
XERCES_CPP_NAMESPACE::XMLPlatformUtils::fgMemoryManager)
: _input(in), XERCES_CPP_NAMESPACE::InputSource(manager)
{}
virtual ~IStreamInputSource(){}
XERCES_CPP_NAMESPACE::BinInputStream* makeStream() const
{
return new StdBinInputStream(_input);
}
private:
std::istream& _input;
};

0 件のコメント:

License

Creative Commons LicenseLeo's Chronicle by Taro L. Saito is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.