Teuchos_XMLObjectImplem.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "Teuchos_XMLObject.hpp"
00030 #include "Teuchos_StrUtils.hpp"
00031
00032 using namespace Teuchos;
00033
00034
00035 XMLObjectImplem::XMLObjectImplem(const std::string& tag)
00036 : tag_(tag), attributes_(), children_(0), content_(0)
00037 {;}
00038
00039 XMLObjectImplem* XMLObjectImplem::deepCopy() const
00040 {
00041 XMLObjectImplem* rtn = new XMLObjectImplem(tag_);
00042 TEST_FOR_EXCEPTION(rtn==0, std::runtime_error, "XMLObjectImplem::deepCopy()");
00043 rtn->attributes_ = attributes_;
00044 rtn->content_ = content_;
00045
00046 for (int i=0; i<children_.length(); i++)
00047 {
00048 rtn->addChild(children_[i].deepCopy());
00049 }
00050
00051 return rtn;
00052 }
00053
00054 int XMLObjectImplem::numChildren() const
00055 {
00056 return children_.length();
00057 }
00058
00059 void XMLObjectImplem::addAttribute(const std::string& name,
00060 const std::string& value)
00061 {
00062 attributes_[name] = value;
00063 }
00064
00065 void XMLObjectImplem::addChild(const XMLObject& child)
00066 {
00067 children_.append(child);
00068 }
00069
00070 void XMLObjectImplem::addContent(const std::string& contentLine)
00071 {
00072 content_.append(contentLine);
00073 }
00074
00075 const XMLObject& XMLObjectImplem::getChild(int i) const
00076 {
00077 return children_[i];
00078 }
00079
00080 std::string XMLObjectImplem::header(bool strictXML) const
00081 {
00082 std::string rtn = "<" + tag_;
00083 for (Map::const_iterator i=attributes_.begin(); i!=attributes_.end(); ++i)
00084 {
00085 if (strictXML)
00086 {
00087 rtn += " "
00088 + (*i).first
00089 + "="
00090 + XMLifyAttVal((*i).second);
00091 }
00092 else
00093 {
00094 rtn += " " + (*i).first + "=\"" + (*i).second + "\"";
00095 }
00096 }
00097
00098 rtn += ">";
00099 return rtn;
00100 }
00101
00102 std::string XMLObjectImplem::XMLifyAttVal(const std::string &attval) {
00103 std::string ret;
00104 bool hasQuot, hasApos;
00105 char delim;
00106
00107 if (attval.find("\"") == std::string::npos)
00108 {
00109 hasQuot = false;
00110 }
00111 else
00112 {
00113 hasQuot = true;
00114 }
00115
00116 if (attval.find("\'") == std::string::npos)
00117 {
00118 hasApos = false;
00119 }
00120 else
00121 {
00122 hasApos = true;
00123 }
00124
00125 if (!hasQuot || hasApos)
00126 {
00127 delim = '\"';
00128 }
00129 else
00130 {
00131 delim = '\'';
00132 }
00133
00134
00135
00136
00137
00138
00139 ret.push_back(delim);
00140 for (std::string::const_iterator i=attval.begin(); i != attval.end(); i++)
00141 {
00142 if (*i == delim)
00143 {
00144 if (delim == '\'') ret.append("'");
00145 else if (delim == '\"') ret.append(""");
00146 }
00147 else if (*i == '&')
00148 {
00149 ret.append("&");
00150 }
00151 else if (*i == '<')
00152 {
00153 ret.append("<");
00154 }
00155 else
00156 {
00157 ret.push_back(*i);
00158 }
00159 }
00160 ret.push_back(delim);
00161
00162 return ret;
00163 }
00164
00165 std::string XMLObjectImplem::terminatedHeader(bool strictXML) const
00166 {
00167 std::string rtn = "<" + tag_;
00168 for (Map::const_iterator i=attributes_.begin(); i!=attributes_.end(); ++i)
00169 {
00170 if (strictXML)
00171 {
00172 rtn += " "
00173 + (*i).first
00174 + "="
00175 + XMLifyAttVal((*i).second);
00176 }
00177 else
00178 {
00179 rtn += " " + (*i).first + "=\"" + (*i).second + "\"";
00180 }
00181 }
00182
00183 rtn += "/>";
00184 return rtn;
00185 }
00186
00187 std::string XMLObjectImplem::toString() const
00188 {
00189 std::string rtn;
00190 if (content_.length()==0 && children_.length()==0)
00191 {
00192 rtn = terminatedHeader() + "\n";
00193 }
00194 else
00195 {
00196 rtn = header() + "\n";
00197 bool allBlankContent = true;
00198 for (int i=0; i<content_.length(); i++)
00199 {
00200 if (!StrUtils::isWhite(content_[i]))
00201 {
00202 allBlankContent=false;
00203 break;
00204 }
00205 }
00206 if (!allBlankContent)
00207 {
00208 for (int i=0; i<content_.length(); i++)
00209 {
00210 rtn += content_[i];
00211 }
00212 rtn += "\n";
00213 }
00214 for (int i=0; i<children_.length(); i++)
00215 {
00216 rtn += children_[i].toString();
00217 }
00218 rtn += "</" + tag_ + ">\n";
00219 }
00220 return rtn;
00221 }
00222
00223 void XMLObjectImplem::print(std::ostream& os, int indent) const
00224 {
00225 for (int i=0; i<indent; i++) os << " ";
00226 if (content_.length()==0 && children_.length()==0)
00227 {
00228 os << terminatedHeader(true) << std::endl;
00229 return;
00230 }
00231 else
00232 {
00233 os << header(true) << std::endl;
00234 printContent(os, indent+2);
00235
00236 for (int i=0; i<children_.length(); i++)
00237 {
00238 children_[i].print(os, indent+2);
00239 }
00240 for (int i=0; i<indent; i++) os << " ";
00241 os << "</" << tag_ << ">\n";
00242 }
00243 }
00244
00245 void XMLObjectImplem::printContent(std::ostream& os, int indent) const
00246 {
00247 std::string space = "";
00248 for (int i=0; i<indent; i++) space += " ";
00249
00250 bool allBlankContent = true;
00251 for (int i=0; i<content_.length(); i++)
00252 {
00253 if (!StrUtils::isWhite(content_[i]))
00254 {
00255 allBlankContent=false;
00256 break;
00257 }
00258 }
00259
00260 if (!allBlankContent)
00261 {
00262 os << space;
00263 for (int i=0; i<content_.length(); i++)
00264 {
00265 os << content_[i];
00266 }
00267 os << '\n';
00268 }
00269 }
00270