diff -r e5cf88ce91ac -r be83e0f457a8 src/XMLCommand.h --- a/src/XMLCommand.h Fri Jan 11 15:01:02 2019 +0100 +++ b/src/XMLCommand.h Fri Jan 11 16:13:21 2019 +0100 @@ -32,6 +32,7 @@ #include #include "StreamInputSource.h" +#include "XercesStringConvertor.h" namespace relpipe { namespace in { @@ -46,21 +47,7 @@ class RelpipeSaxHandler : public xercesc::DefaultHandler { private: unique_ptr writer; - - std::wstring_convert> convertor; // TODO: support also other encodings. - - string_t toString(const XMLCh * const chars) { - // XMLCh = char16_t - // „All XML data is handled within Xerces-C++ as strings of XMLCh characters. Regardless of the size of the type chosen, the data stored in variables of type XMLCh will always be utf-16 encoded values.“ - // see https://xerces.apache.org/xerces-c/program-others-3.html - // other solution (depends on boost): https://flylib.com/books/en/2.131.1/working_with_xerces_strings.html - - // TODO: review this text conversion and test on various platforms - char* x = XMLString::transcode(chars); - string s = string(x); - XMLString::release(&x); - return convertor.from_bytes(s); - } + XercesStringConvertor xConvertor; public: @@ -81,25 +68,25 @@ void startElement(const XMLCh * const uri, const XMLCh * const localname, const XMLCh * const qname, const Attributes& attrs) override { writer->writeAttribute(L"startElement"); - writer->writeAttribute(toString(uri)); - writer->writeAttribute(toString(localname)); - writer->writeAttribute(toString(qname)); + writer->writeAttribute(xConvertor.toString(uri)); + writer->writeAttribute(xConvertor.toString(localname)); + writer->writeAttribute(xConvertor.toString(qname)); writer->writeAttribute(L""); for (int i = 0; i < attrs.getLength(); i++) { writer->writeAttribute(L"attribute"); - writer->writeAttribute(toString(attrs.getURI(i))); - writer->writeAttribute(toString(attrs.getLocalName(i))); - writer->writeAttribute(toString(attrs.getQName(i))); - writer->writeAttribute(toString(attrs.getValue(i))); + writer->writeAttribute(xConvertor.toString(attrs.getURI(i))); + writer->writeAttribute(xConvertor.toString(attrs.getLocalName(i))); + writer->writeAttribute(xConvertor.toString(attrs.getQName(i))); + writer->writeAttribute(xConvertor.toString(attrs.getValue(i))); } } void endElement(const XMLCh * const uri, const XMLCh * const localname, const XMLCh * const qname) override { writer->writeAttribute(L"endElement"); - writer->writeAttribute(toString(uri)); - writer->writeAttribute(toString(localname)); - writer->writeAttribute(toString(qname)); + writer->writeAttribute(xConvertor.toString(uri)); + writer->writeAttribute(xConvertor.toString(localname)); + writer->writeAttribute(xConvertor.toString(qname)); writer->writeAttribute(L""); } @@ -108,7 +95,7 @@ writer->writeAttribute(L""); writer->writeAttribute(L""); writer->writeAttribute(L""); - writer->writeAttribute(toString(chars)); + writer->writeAttribute(xConvertor.toString(chars)); } void comment(const XMLCh * const chars, const XMLSize_t length) override { @@ -116,7 +103,7 @@ writer->writeAttribute(L""); writer->writeAttribute(L""); writer->writeAttribute(L""); - writer->writeAttribute(toString(chars)); + writer->writeAttribute(xConvertor.toString(chars)); } void startCDATA() override {