00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "util/xml_helper.h"
00015
00016 #include <sstream>
00017 #include <string>
00018
00019 #include "base/stringprintf.h"
00020 #include "base/strutil.h"
00021
00022 namespace operations_research {
00023
00024 XmlHelper::XmlHelper() {}
00025
00026 void XmlHelper::StartDocument() {
00027 content_ = "<?xml version=\"1.0\"?>\n";
00028 direction_down_ = false;
00029 }
00030
00031 void XmlHelper::StartElement(const string& name) {
00032 if (direction_down_) {
00033 content_.append(">\n");
00034 }
00035 tags_.push(name);
00036 StringAppendF(&content_, "<%s", name.c_str());
00037 direction_down_ = true;
00038 }
00039
00040 void XmlHelper::AddAttribute(const string& key, int value) {
00041 AddAttribute(key, StringPrintf("%d", value));
00042 }
00043
00044 void XmlHelper::AddAttribute(const string& key, const string& value) {
00045 std::ostringstream escaped_value;
00046
00047 for (string::const_iterator it = value.begin(); it != value.end(); ++it) {
00048 unsigned char c = (unsigned char)*it;
00049
00050 switch (c) {
00051 case '"':
00052 escaped_value << """;
00053 break;
00054 case '\'':
00055 escaped_value << "'";
00056 break;
00057 case '<':
00058 escaped_value << "<";
00059 break;
00060 case '>':
00061 escaped_value << ">";
00062 break;
00063 case '&':
00064 escaped_value << "&";
00065 break;
00066 default:
00067 escaped_value << c;
00068 }
00069 }
00070
00071 StringAppendF(&content_, " %s=\"%s\"", key.c_str(),
00072 escaped_value.str().c_str());
00073 }
00074
00075 void XmlHelper::EndElement() {
00076 string tag = tags_.top();
00077
00078 if (direction_down_) {
00079 content_.append(" />\n");
00080 } else {
00081 StringAppendF(&content_, "</%s>\n", tag.c_str());
00082 }
00083 direction_down_ = false;
00084
00085 tags_.pop();
00086 }
00087
00088 void XmlHelper::EndDocument() {}
00089
00090 const string& XmlHelper::GetContent() const { return content_; }
00091 }