00001 #include "SDXXMLStreamWriter.h"
00002
00003 using namespace std;
00004 using namespace SDX::Formats;
00005
00006 XmlStreamWriter::XmlStreamWriter() :
00007 m_docName("Document")
00008 {
00009
00010 }
00011
00012 void XmlStreamWriter::setDocumentName(string name){
00013 m_docName = name;
00014 }
00015
00016 void XmlStreamWriter::startDocument(){
00017 *m_oStream << "<" << m_docName << ">";
00018 }
00019
00020 void XmlStreamWriter::startNode(string nodeName){
00021 if(!m_nodeInfos.empty() && !m_nodeInfos.top().hasContent && !m_nodeInfos.top().hasChildren)
00022 *m_oStream << ">";
00023 if(!m_nodeInfos.empty())
00024 m_nodeInfos.top().hasChildren = true;
00025
00026 *m_oStream << endl;
00027 printIndentation();
00028
00029 *m_oStream << "<" << nodeName;
00030
00031 m_nodeInfos.push(NodeInfo(nodeName));
00032 }
00033
00034 void XmlStreamWriter::writeAttribute(string name, string value){
00035 if(name.empty()){
00036 if(!m_nodeInfos.top().hasContent)
00037 *m_oStream << ">";
00038
00039 *m_oStream << value;
00040
00041 m_nodeInfos.top().hasContent = true;
00042 } else {
00043 *m_oStream << " " << name << "=\"" << value << '"';
00044
00045 m_nodeInfos.top().hasAttributes = true;
00046 }
00047 }
00048
00049 void XmlStreamWriter::endDocument(){
00050 printIndentation();
00051 *m_oStream << endl;
00052
00053 *m_oStream << "</" << m_docName << ">";
00054 }
00055
00056 void XmlStreamWriter::endNode(){
00057 if(m_nodeInfos.top().hasChildren){
00058 *m_oStream << endl;
00059 printIndentation(true);
00060 }
00061 if(m_nodeInfos.top().hasContent || m_nodeInfos.top().hasChildren){
00062 *m_oStream << "</" << m_nodeInfos.top().name << ">";
00063 } else {
00064 *m_oStream << " />";
00065 }
00066
00067 m_nodeInfos.pop();
00068 }
00069
00070 void XmlStreamWriter::printIndentation(bool minusOne){
00071 for(int i = 0; i <= (minusOne ? m_nodeInfos.size() - 1 : m_nodeInfos.size()); ++i)
00072 *m_oStream << "\t";
00073 }