34 |
34 |
35 namespace relpipe { |
35 namespace relpipe { |
36 namespace in { |
36 namespace in { |
37 namespace xml { |
37 namespace xml { |
38 |
38 |
|
39 using namespace relpipe::writer; |
|
40 using namespace xercesc; |
|
41 |
39 class XMLCommand { |
42 class XMLCommand { |
|
43 private: |
|
44 |
|
45 class RelpipeSaxHandler : public xercesc::DefaultHandler { |
|
46 private: |
|
47 unique_ptr<RelationalWriter> writer; |
|
48 |
|
49 public: |
|
50 |
|
51 RelpipeSaxHandler(std::ostream& output) : DefaultHandler(), writer(Factory::create(output)) { |
|
52 } |
|
53 |
|
54 void startElement(const XMLCh * const uri, const XMLCh * const localname, const XMLCh * const qname, const Attributes& attrs) override { |
|
55 //XMLString:: |
|
56 // TODO: remove demo |
|
57 writer->startRelation(L"xml_startElement",{ |
|
58 {L"s", TypeId::STRING}, |
|
59 }, true); |
|
60 |
|
61 writer->writeAttribute(L"a"); |
|
62 } |
|
63 |
|
64 void endElement(const XMLCh * const uri, const XMLCh * const localname, const XMLCh * const qname) override { |
|
65 // TODO: remove demo |
|
66 writer->startRelation(L"xml_endElement",{ |
|
67 {L"s", TypeId::STRING}, |
|
68 }, true); |
|
69 |
|
70 writer->writeAttribute(L"a"); |
|
71 } |
|
72 |
|
73 void endDocument() override { |
|
74 // TODO: remove demo |
|
75 writer->startRelation(L"xml_endDocument",{ |
|
76 {L"s", TypeId::STRING}, |
|
77 }, true); |
|
78 |
|
79 writer->writeAttribute(L"a"); |
|
80 } |
|
81 |
|
82 }; |
|
83 |
40 public: |
84 public: |
41 |
85 |
42 void process(std::istream& input, std::ostream& output) { |
86 void process(std::istream& input, std::ostream& output) { |
43 using namespace relpipe::writer; |
|
44 using namespace xercesc; |
|
45 unique_ptr<RelationalWriter> writer(Factory::create(output)); |
|
46 XMLPlatformUtils::Initialize(); |
87 XMLPlatformUtils::Initialize(); |
47 |
|
48 |
|
49 unique_ptr<SAX2XMLReader> parser(XMLReaderFactory::createXMLReader()); |
88 unique_ptr<SAX2XMLReader> parser(XMLReaderFactory::createXMLReader()); |
50 parser->setFeature(XMLUni::fgSAX2CoreValidation, true); |
89 parser->setFeature(XMLUni::fgSAX2CoreValidation, true); |
51 parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); |
90 parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); |
52 |
91 |
53 // TODO: custom handler that reads |
92 RelpipeSaxHandler saxHandler(output); |
54 DefaultHandler defaultHandler; |
93 parser->setContentHandler(&saxHandler); |
55 parser->setContentHandler(&defaultHandler); |
94 parser->setErrorHandler(&saxHandler); |
56 parser->setErrorHandler(&defaultHandler); |
|
57 |
95 |
58 StreamInputSource inputSource(input); |
96 StreamInputSource inputSource(input); |
59 |
97 |
60 parser->parse(inputSource); |
98 parser->parse(inputSource); |
61 |
|
62 |
|
63 // TODO: remove demo |
|
64 // Various data types passed as strings |
|
65 writer->startRelation(L"xml",{ |
|
66 {L"s", TypeId::STRING}, |
|
67 {L"i", TypeId::INTEGER}, |
|
68 {L"b", TypeId::BOOLEAN} |
|
69 }, true); |
|
70 |
|
71 writer->writeAttribute(L"a"); |
|
72 writer->writeAttribute(L"1"); |
|
73 writer->writeAttribute(L"true"); |
|
74 |
|
75 } |
99 } |
76 }; |
100 }; |
77 |
101 |
78 } |
102 } |
79 } |
103 } |