17#include "xml_simplewriter.h"
18#include "basic_xpath_reader.h"
43 class XMLReader :
protected XMLXPathReader::BasicXPathReader
73 void open(
const std::string& filename);
80 void open(std::istream& is);
103 void get(
const std::string& xpath, std::string& result);
105 void get(
const std::string& xpath,
int& result);
107 void get(
const std::string& xpath,
unsigned int& result);
109 void get(
const std::string& xpath,
short int& result);
111 void get(
const std::string& xpath,
unsigned short int& result);
113 void get(
const std::string& xpath,
long int& result);
115 void get(
const std::string& xpath,
unsigned long int& result);
117 void get(
const std::string& xpath,
float& result);
119 void get(
const std::string& xpath,
double& result);
121 void get(
const std::string& xpath,
bool& result);
125 const std::string& attrib_name,
130 void set(
const std::string& xpath,
const T& to_set)
134 BasicXPathReader::set<T>(xpath, to_set);
140 void print(std::ostream& is);
146 int count(
const std::string& xpath);
168 const std::string& attrib_name,
178 void read(
XMLReader& xml,
const std::string& s, std::string& input);
180 void read(
XMLReader& xml,
const std::string& s,
char& input);
184 void read(
XMLReader& xml,
const std::string& s,
unsigned int& input);
186 void read(
XMLReader& xml,
const std::string& s,
short int& input);
188 void read(
XMLReader& xml,
const std::string& s,
unsigned short int& input);
190 void read(
XMLReader& xml,
const std::string& s,
long int& input);
192 void read(
XMLReader& xml,
const std::string& s,
unsigned long int& input);
194 void read(
XMLReader& xml,
const std::string& s,
float& input);
196 void read(
XMLReader& xml,
const std::string& s,
double& input);
198 void read(
XMLReader& xml,
const std::string& s,
bool& input);
208 std::ostringstream error_message;
211 std::string elem_base_query =
"elem";
215 array_size = arraytop.
count(elem_base_query);
217 catch(
const std::string& e) {
218 error_message <<
"Exception occurred while counting " << elem_base_query
219 <<
" during array read " << std::endl;
226 for(
int i=0; i < input.
size(); i++)
228 std::ostringstream element_xpath;
231 element_xpath << elem_base_query <<
"[" << (i+1) <<
"]";
236 read(arraytop, element_xpath.str(), input[i]);
238 catch (
const std::string& e)
240 error_message <<
"Failed to match element " << i
241 <<
" of array with query " << element_xpath.str()
243 <<
"Query returned error: " << e;
244 throw error_message.str();
252 void read(XMLReader& xml,
const std::string& s, multi1d<int>& input);
254 void read(XMLReader& xml,
const std::string& s, multi1d<unsigned int>& input);
256 void read(XMLReader& xml,
const std::string& s, multi1d<short int>& input);
258 void read(XMLReader& xml,
const std::string& s, multi1d<unsigned short int>& input);
260 void read(XMLReader& xml,
const std::string& s, multi1d<long int>& input);
262 void read(XMLReader& xml,
const std::string& s, multi1d<unsigned long int>& input);
264 void read(XMLReader& xml,
const std::string& s, multi1d<float>& input);
266 void read(XMLReader& xml,
const std::string& s, multi1d<double>& input);
268 void read(XMLReader& xml,
const std::string& s, multi1d<bool>& input);
280 std::ostringstream error_message;
281 std::string elemName =
"elem";
284 std::string elem_base_query = elemName;
288 array_size = arraytop.
count(elem_base_query);
290 catch(
const std::string& e) {
291 error_message <<
"Exception occurred while counting " << elem_base_query
292 <<
" during array read " << s << std::endl;
294 throw error_message.str();
298 input.resize(array_size);
301 for(
int i=0; i < input.size(); i++)
303 std::ostringstream element_xpath;
306 element_xpath << elem_base_query <<
"[" << (i+1) <<
"]";
310 read(arraytop, element_xpath.str(), input[i]);
312 catch (
const std::string& e)
314 error_message <<
"Failed to match element " << i
315 <<
" of array " << s <<
" with query " << element_xpath.str()
317 <<
"Query returned error: " << e;
319 throw error_message.str();
329 void read(XMLReader& xml,
const std::string& s, std::vector<int>& input);
330 void read(XMLReader& xml,
const std::string& s, std::vector<unsigned int>& input);
331 void read(XMLReader& xml,
const std::string& s, std::vector<short int>& input);
332 void read(XMLReader& xml,
const std::string& s, std::vector<unsigned short int>& input);
333 void read(XMLReader& xml,
const std::string& s, std::vector<long int>& input);
334 void read(XMLReader& xml,
const std::string& s, std::vector<unsigned long int>& input);
335 void read(XMLReader& xml,
const std::string& s, std::vector<float>& input);
336 void read(XMLReader& xml,
const std::string& s, std::vector<double>& input);
349 std::ostringstream error_message;
350 std::string elemName =
"elem";
353 std::string elem_base_query = elemName;
357 array_size = arraytop.
count(elem_base_query);
359 catch(
const std::string& e) {
360 error_message <<
"Exception occurred while counting " << elem_base_query
361 <<
" during array read " << s << std::endl;
363 throw error_message.str();
370 for(
int i=0; i < input.size(); i++)
372 std::ostringstream element_xpath;
375 element_xpath << elem_base_query <<
"[" << (i+1) <<
"]";
380 read(arraytop, element_xpath.str(), thingy);
382 input.push_back(thingy);
384 catch (
const std::string& e)
386 error_message <<
"Failed to match element " << i
387 <<
" of array " << s <<
" with query " << element_xpath.str()
389 <<
"Query returned error: " << e;
391 throw error_message.str();
401 void read(XMLReader& xml,
const std::string& s, std::list<int>& input);
402 void read(XMLReader& xml,
const std::string& s, std::list<unsigned int>& input);
403 void read(XMLReader& xml,
const std::string& s, std::list<short int>& input);
404 void read(XMLReader& xml,
const std::string& s, std::list<unsigned short int>& input);
405 void read(XMLReader& xml,
const std::string& s, std::list<long int>& input);
406 void read(XMLReader& xml,
const std::string& s, std::list<unsigned long int>& input);
407 void read(XMLReader& xml,
const std::string& s, std::list<float>& input);
408 void read(XMLReader& xml,
const std::string& s, std::list<double>& input);
424 template<
typename K,
typename V>
430 std::ostringstream error_message;
431 std::string elemName =
"elem";
435 array_size = arraytop.
count(elemName);
437 catch(
const std::string& e) {
438 error_message <<
"Exception occurred while counting " << elemName
439 <<
" during array read " << s << std::endl;
441 throw error_message.str();
445 for(
int i=0; i < array_size; i++)
447 std::ostringstream element_xpath;
450 element_xpath << elemName <<
"[" << (i+1) <<
"]";
454 XMLReader xml_elem(arraytop, element_xpath.str());
459 read(xml_elem,
"Key", key);
460 read(xml_elem,
"Val", val);
462 input.insert(std::make_pair(key, val));
464 catch (
const std::string& e)
466 error_message <<
"Failed to match element " << i
467 <<
" of array " << s <<
" with query " << element_xpath.str()
469 <<
"Query returned error: " << e;
471 throw error_message.str();
483 template<
typename T1,
typename T2>
489 read(paramtop,
"First", input.first);
490 read(paramtop,
"Second", input.second);
505 class XMLWriter :
protected XMLWriterAPI::XMLSimpleWriter
517 virtual void openSimple(
const std::string& tagname);
524 virtual void openStruct(
const std::string& tagname);
531 void openTag(
const std::string& tagname);
538 void openTag(
const std::string& nsprefix,
const std::string& tagname);
545 void openTag(
const std::string& tagname, XMLWriterAPI::AttributeList& al);
553 void openTag(
const std::string& nsprefix,
554 const std::string& tagname,
555 XMLWriterAPI::AttributeList& al);
564 void emptyTag(
const std::string& tagname);
571 void emptyTag(
const std::string& nsprefix,
const std::string& tagname);
578 void emptyTag(
const std::string& tagname, XMLWriterAPI::AttributeList& al);
586 void emptyTag(
const std::string& nsprefix,
587 const std::string& tagname,
588 XMLWriterAPI::AttributeList& al);
594 void write(
const std::string& output);
596 void write(
const int& output);
598 void write(
const unsigned int& output);
600 void write(
const short int& output);
602 void write(
const unsigned short int& output);
604 void write(
const long int& output);
606 void write(
const unsigned long int& output);
608 void write(
const float& output);
610 void write(
const double& output);
612 void write(
const bool& output);
615 void writeXML(
const std::string& output);
648 void write(
XMLWriter& xml,
const std::string& s,
const std::string& output);
655 void write(
XMLWriter& xml,
const std::string& s,
const char* output);
662 void write(
XMLWriter& xml,
const std::string& s,
const char& output);
669 void write(
XMLWriter& xml,
const std::string& s,
const int& output);
676 void write(
XMLWriter& xml,
const std::string& s,
const unsigned int& output);
683 void write(
XMLWriter& xml,
const std::string& s,
const short int& output);
690 void write(
XMLWriter& xml,
const std::string& s,
const unsigned short int& output);
697 void write(
XMLWriter& xml,
const std::string& s,
const long int& output);
704 void write(
XMLWriter& xml,
const std::string& s,
const unsigned long int& output);
711 void write(
XMLWriter& xml,
const std::string& s,
const float& output);
718 void write(
XMLWriter& xml,
const std::string& s,
const double& output);
725 void write(
XMLWriter& xml,
const std::string& s,
const bool& output);
757 XMLWriterAPI::AttributeList alist;
758 alist.push_back(XMLWriterAPI::Attribute(
"minOccurs", s1.
size()));
759 alist.push_back(XMLWriterAPI::Attribute(
"maxOccurs", s1.
size()));
762 xml.
openTag(
"sequence", alist);
765 for(
int index=0; index < s1.
size(); index++)
767 write(xml,
"elem", s1[index]);
788 void write(XMLWriter& xml,
const std::string& s,
const multi1d<int>& output);
797 void write(XMLWriter& xml,
const std::string& s,
const multi1d<unsigned int>& output);
806 void write(XMLWriter& xml,
const std::string& s,
const multi1d<short int>& output);
815 void write(XMLWriter& xml,
const std::string& s,
const multi1d<unsigned short int>& output);
824 void write(XMLWriter& xml,
const std::string& s,
const multi1d<long int>& output);
833 void write(XMLWriter& xml,
const std::string& s,
const multi1d<unsigned long int>& output);
842 void write(XMLWriter& xml,
const std::string& s,
const multi1d<float>& output);
851 void write(XMLWriter& xml,
const std::string& s,
const multi1d<double>& output);
860 void write(XMLWriter& xml,
const std::string& s,
const multi1d<bool>& output);
863 template<
class RHS,
class C>
866 return write(xml, s,
C(d));
895 void write(XMLWriter& xml,
const std::string& s,
const multi2d<T>& s1)
897 for(
int j=0; j < s1.size1(); ++j)
898 for(
int i=0; i < s1.size2(); ++i)
900 std::ostringstream ost;
902 ost << s <<
"[ " << i <<
" ][ " << j <<
" ]";
903 write(xml, ost.str(), s1[i][j]);
921 for(
unsigned index=0; index < s1.size(); index++)
923 write(xml,
"elem", s1[index]);
931 void write(XMLWriter& xml,
const std::string& s,
const std::vector<int>& output);
932 void write(XMLWriter& xml,
const std::string& s,
const std::vector<unsigned int>& output);
933 void write(XMLWriter& xml,
const std::string& s,
const std::vector<short int>& output);
934 void write(XMLWriter& xml,
const std::string& s,
const std::vector<unsigned short int>& output);
935 void write(XMLWriter& xml,
const std::string& s,
const std::vector<long int>& output);
936 void write(XMLWriter& xml,
const std::string& s,
const std::vector<unsigned long int>& output);
937 void write(XMLWriter& xml,
const std::string& s,
const std::vector<float>& output);
938 void write(XMLWriter& xml,
const std::string& s,
const std::vector<double>& output);
939 void write(XMLWriter& xml,
const std::string& s,
const std::vector<bool>& output);
952 for(
typename std::list<T>::const_iterator t=s1.begin(); t != s1.end(); ++t)
954 write(xml,
"elem", *t);
962 void write(XMLWriter& xml,
const std::string& s,
const std::list<int>& output);
963 void write(XMLWriter& xml,
const std::string& s,
const std::list<unsigned int>& output);
964 void write(XMLWriter& xml,
const std::string& s,
const std::list<short int>& output);
965 void write(XMLWriter& xml,
const std::string& s,
const std::list<unsigned short int>& output);
966 void write(XMLWriter& xml,
const std::string& s,
const std::list<long int>& output);
967 void write(XMLWriter& xml,
const std::string& s,
const std::list<unsigned long int>& output);
968 void write(XMLWriter& xml,
const std::string& s,
const std::list<float>& output);
969 void write(XMLWriter& xml,
const std::string& s,
const std::list<double>& output);
970 void write(XMLWriter& xml,
const std::string& s,
const std::list<bool>& output);
987 template<
typename K,
typename V>
993 for(
typename std::map<K,V>::const_iterator pp = param.begin();
998 write(xml,
"Key", pp->first);
999 write(xml,
"Val", pp->second);
1008 template<
typename T1,
typename T2>
1014 write(xml,
"First", param.first);
1015 write(xml,
"Second", param.second);
1037 void open(
const std::string& s);
1040 std::string
str()
const;
1053 std::ostringstream output_stream;
1056 std::ostream& getOstream(
void) {
return output_stream;}
1080 open(filename, write_prologue);
1097 void open(
const std::string& filename,
bool write_prologue=
true);
1109 std::ofstream output_stream;
1110 std::ostream& getOstream(
void) {
return output_stream;}
1126 output_xml(xml_out), array_size(
size)
1128 initP = arrayTag =
false;
1129 elements_written = 0;
1130 indent_level = xml_out.indent_level;
1131 simpleElements =
false;
1145 int size()
const {
return array_size;}
1147 void openArray(
const std::string& tagname);
1158 std::string elem_qname;
1162 bool simpleElements;
1168 int elements_written;
1171 enum ElementType {SIMPLE, STRUCT};
1172 std::stack<ElementType> contextStack;
1174 std::ostream& getOstream(
void) {
return output_xml.getOstream();}
1d array, with 1-based indices
const std::vector< T > & ref() const
Return ref to underlying array.
Outer grid Scalar class */.
Expression class for QDP.
Writes metadata to an array which serves as a handle for another XML object.
void openArray(const std::string &tagname)
XMLArrayWriter(XMLWriter &xml_out, int size=-1)
void close()
Closes the array writer.
int size() const
Returns the size of the array.
void openStruct(const std::string &tagname)
Writes an opening XML tag.
Writes XML metadata to a buffer.
std::string printCurrentContext() const
void flush()
Flush the buffer.
~XMLBufferWriter()
Destroy.
bool fail() const
Return true if some failure occurred in previous IO operation.
std::string str() const
Return entire buffer as a string.
void open(const std::string &s)
Construct from a string.
Writes XML metadata to a file.
void flush()
Flush the buffer.
XMLFileWriter(const std::string &filename, bool write_prologue=true)
Constructor from a filename.
void close()
Closes the last file opened.
void open(const std::string &filename, bool write_prologue=true)
Opens a file.
bool is_open()
Queries whether the binary file is open.
bool fail() const
Return true if some failure occurred in previous IO operation.
void open(const std::string &filename)
Opens and reads an XML file.
void getAttribute(const std::string &xpath, const std::string &attrib_name, int &result)
read integer attributes so that I can read Matrices in XML
void printCurrentContext(std::ostream &is)
Print the current context.
XMLReader()
Empty constructor.
void readPrimitive(const std::string &xpath, T &output)
bool is_derived() const
Queries whether the XML data has been obtained from another XMLReader.
void registerNamespace(const std::string &prefix, const std::string &uri)
void set(const std::string &xpath, const T &to_set)
Set a replacement of a primitive.
int count(const std::string &xpath)
Count the number of occurances from the Xpath query.
void get(const std::string &xpath, std::string &result)
Xpath query.
bool is_open()
Queries whether the binary file is open.
void close()
Closes the last file opened.
void print(std::ostream &is)
Return the entire contents of the Reader as a stream.
void readAttrPrimitive(const std::string &xpath, const std::string &attrib_name, T &result)
virtual void closeStruct()
virtual void closeSimple()
void openTag(const std::string &tagname)
Writes an opening XML tag.
void emptyTag(const std::string &nsprefix, const std::string &tagname)
Writes an empty tag.
friend class XMLArrayWriter
void write(const std::string &output)
Write tag contents.
void emptyTag(const std::string &tagname)
Writes an empty tag.
void writeXML(const std::string &output)
void closeTag()
Closes a tag.
virtual void openSimple(const std::string &tagname)
Writes an opening XML tag.
virtual void openStruct(const std::string &tagname)
Writes an opening XML tag.
Container for a multi-dimensional 1D array.
int size() const
Size of array.
void resize(int ns1)
Resize routine, call a templated resize, using *this to disambiguate.
TextWriter & operator<<(TextWriter &txt, const std::string &output)
void write(BinaryWriter &bin, const std::string &output)
void read(BinaryReader &bin, std::string &input, size_t maxBytes)
OLattice< PScalar< PColorMatrix< RComplexFloat, 3 > > > C
bool primaryNode()
Returns whether this is the primary node.
Yet another random number generator.
void push(XMLWriter &xml, const std::string &s)
Push a group name.
void pop(XMLWriter &xml)
Pop a group name.