mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-29 04:17:55 +01:00
Add RoundTrip example for XML Streaming API + backport lates libstudxml changes from upstream
This commit is contained in:
101
XML/samples/RoundTrip/src/RoundTrip.cpp
Normal file
101
XML/samples/RoundTrip/src/RoundTrip.cpp
Normal file
@@ -0,0 +1,101 @@
|
||||
// file : examples/roundtrip/driver.cxx
|
||||
// copyright : not copyrighted - public domain
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#include "Poco/XML/XMLStreamParser.h"
|
||||
#include "Poco/XML/XMLStreamSerializer.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace Poco::XML;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
if (argc != 2)
|
||||
{
|
||||
cerr << "usage: " << argv[0] << " <xml-file>" << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Enable stream exceptions so that io failures are reported
|
||||
// as stream rather than as parsing exceptions.
|
||||
//
|
||||
ifstream ifs;
|
||||
ifs.exceptions(ifstream::badbit | ifstream::failbit);
|
||||
ifs.open(argv[1], ifstream::in | ifstream::binary);
|
||||
|
||||
// Configure the parser to receive attributes as events as well
|
||||
// as to receive prefix-namespace mappings (namespace declarations
|
||||
// in XML terminology).
|
||||
//
|
||||
XMLStreamParser p(ifs, argv[1],
|
||||
XMLStreamParser::RECEIVE_DEFAULT | XMLStreamParser::RECEIVE_ATTRIBUTES_EVENT | XMLStreamParser::RECEIVE_NAMESPACE_DECLS);
|
||||
|
||||
// Configure serializer not to perform indentation. Existing
|
||||
// indentation, if any, will be preserved.
|
||||
//
|
||||
XMLStreamSerializer s(cout, "out", 0);
|
||||
|
||||
for (XMLStreamParser::EventType e(p.next()); e != XMLStreamParser::Eof; e = p.next())
|
||||
{
|
||||
switch (e)
|
||||
{
|
||||
case XMLStreamParser::StartElement:
|
||||
{
|
||||
s.startElement(p.getQName());
|
||||
break;
|
||||
}
|
||||
case XMLStreamParser::EndElement:
|
||||
{
|
||||
s.endElement();
|
||||
break;
|
||||
}
|
||||
case XMLStreamParser::StartNamespaceDecl:
|
||||
{
|
||||
s.namespaceDecl(p.namespace_(), p.prefix());
|
||||
break;
|
||||
}
|
||||
case XMLStreamParser::EndNamespaceDecl:
|
||||
{
|
||||
// There is nothing in XML that indicates the end of namespace
|
||||
// declaration since it is scope-based.
|
||||
//
|
||||
break;
|
||||
}
|
||||
case XMLStreamParser::StartAttribute:
|
||||
{
|
||||
s.startAttribute(p.getQName());
|
||||
break;
|
||||
}
|
||||
case XMLStreamParser::EndAttribute:
|
||||
{
|
||||
s.endAttribute();
|
||||
break;
|
||||
}
|
||||
case XMLStreamParser::Characters:
|
||||
{
|
||||
s.characters(p.value());
|
||||
break;
|
||||
}
|
||||
case XMLStreamParser::Eof:
|
||||
{
|
||||
// Handled in the for loop.
|
||||
//
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (const ios_base::failure&)
|
||||
{
|
||||
cerr << "io failure" << endl;
|
||||
return 1;
|
||||
} catch (const Poco::Exception& e)
|
||||
{
|
||||
cerr << e.displayText() << endl;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user