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__ 41 #ifdef CIFTILIB_USE_QT 42 #define __XML_ADAPTER_H_HAVE_IMPL__ 43 #include <QXmlStreamReader> 44 #include <QXmlStreamWriter> 47 typedef QXmlStreamReader XmlReader;
48 typedef QXmlStreamWriter XmlWriter;
50 #endif //CIFTILIB_USE_QT 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];
138 #endif //CIFTILIB_USE_XMLPP 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);
166 #endif //__XML_ADAPTER_H__ namespace for all CiftiLib functionality
Definition: CiftiBrainModelsMap.h:41
Definition: XmlAdapter.h:149
Definition: XmlAdapter.h:147