1#ifndef __XML_ADAPTER_H__
2#define __XML_ADAPTER_H__
32#include "CiftiException.h"
37#ifdef __XML_ADAPTER_H_HAVE_IMPL__
38#undef __XML_ADAPTER_H_HAVE_IMPL__
42#define __XML_ADAPTER_H_HAVE_IMPL__
43#include <QXmlStreamReader>
44#include <QXmlStreamWriter>
47 typedef QXmlStreamReader XmlReader;
48 typedef QXmlStreamWriter XmlWriter;
52#ifdef CIFTILIB_USE_XMLPP
53#define __XML_ADAPTER_H_HAVE_IMPL__
54#include "libxml++/libxml++.h"
55#include "libxml++/parsers/textreader.h"
56#include "libxml/xmlwriter.h"
57#include "libxml/xmlstring.h"
60 typedef xmlpp::TextReader XmlReader;
63 xmlTextWriterPtr m_xmlPtr;
64 xmlBufferPtr m_bufPtr;
65 std::vector<AString> m_elementStack;
69 m_bufPtr = xmlBufferCreate();
70 if (m_bufPtr == NULL)
throw CiftiException(
"error creating xml buffer");
71 m_xmlPtr = xmlNewTextWriterMemory(m_bufPtr, 0);
74 xmlBufferFree(m_bufPtr);
75 throw CiftiException(
"error creating xml writer");
77 if (xmlTextWriterSetIndent(m_xmlPtr, 1) != 0 || xmlTextWriterSetIndentString(m_xmlPtr, BAD_CAST
" ") != 0)
79 throw CiftiException(
"error setting xml writer indentation");
84 xmlFreeTextWriter(m_xmlPtr);
85 xmlBufferFree(m_bufPtr);
87 void writeStartDocument()
89 if (xmlTextWriterStartDocument(m_xmlPtr, NULL, NULL, NULL) == -1)
throw CiftiException(
"error writing document start");
91 void writeEndDocument()
93 if (xmlTextWriterEndDocument(m_xmlPtr) == -1)
throw CiftiException(
"error writing document end");
94 m_elementStack.clear();
96 void writeStartElement(
const AString& name)
98 if (xmlTextWriterStartElement(m_xmlPtr, BAD_CAST ASTRING_UTF8_RAW(name)) == -1)
throw CiftiException(
"error writing " + name +
" element");
99 m_elementStack.push_back(name);
101 void writeEndElement()
103 if (m_elementStack.empty())
throw CiftiException(
"internal error: attempted writing end element outside root element");
104 if (xmlTextWriterEndElement(m_xmlPtr) == -1)
throw CiftiException(
"error writing end element for " + m_elementStack.back());
105 m_elementStack.pop_back();
107 void writeCharacters(
const AString& text)
109 if (xmlTextWriterWriteString(m_xmlPtr, BAD_CAST ASTRING_UTF8_RAW(text)) == -1)
throw CiftiException(
"error writing element text");
111 void writeTextElement(
const AString& name,
const AString& text)
113 if (xmlTextWriterWriteElement(m_xmlPtr, BAD_CAST ASTRING_UTF8_RAW(name), BAD_CAST ASTRING_UTF8_RAW(text)) == -1)
115 throw CiftiException(
"error writing " + name +
" element");
118 void writeAttribute(
const AString& name,
const AString& text)
120 if (m_elementStack.empty())
throw CiftiException(
"internal error: attempted writing attribute outside root element");
121 if (xmlTextWriterWriteAttribute(m_xmlPtr, BAD_CAST ASTRING_UTF8_RAW(name), BAD_CAST ASTRING_UTF8_RAW(text)) == -1)
123 throw CiftiException(
"error writing " + name +
" attribute of " + m_elementStack.back() +
" element");
126 std::vector<char> getXmlData()
const
128 std::vector<char> ret(m_bufPtr->use);
129 for (
unsigned int i = 0; i < m_bufPtr->use; ++i)
131 ret[i] = m_bufPtr->content[i];
140#ifndef __XML_ADAPTER_H_HAVE_IMPL__
141#error "you must define either CIFTILIB_USE_QT or CIFTILIB_USE_XMLPP to select what XML implementation to use"
155 std::vector<AString> mandatoryVals;
156 std::vector<OptionalStatus> optionalVals;
159 AString XmlReader_readElementText(XmlReader& xml);
160 bool XmlReader_readNextStartElement(XmlReader& xml);
161 AString XmlReader_elementName(XmlReader& xml);
162 XmlAttributesResult XmlReader_parseAttributes(XmlReader& xml,
const std::vector<AString>& mandatoryNames,
const std::vector<AString>& optionalNames = std::vector<AString>());
163 bool XmlReader_checkEndElement(XmlReader& xml,
const AString& elementName);
namespace for all CiftiLib functionality
Definition CiftiBrainModelsMap.h:42
Definition XmlAdapter.h:150
Definition XmlAdapter.h:148