aboutsummaryrefslogtreecommitdiff
path: root/sxml.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sxml.cpp')
-rw-r--r--sxml.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/sxml.cpp b/sxml.cpp
new file mode 100644
index 0000000..f5be854
--- /dev/null
+++ b/sxml.cpp
@@ -0,0 +1,140 @@
+/*
+ * This file is part of sxml - stupid XML generator
+ *
+ * Copyright (c) 2011 Oskari Timperi
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute
+ * it freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must
+ * not claim that you wrote the original software. If you use this
+ * software in a product, an acknowledgment in the product documentation
+ * would be appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must
+ * not be misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ * distribution.
+ */
+
+#include "sxml.h"
+
+#include <sstream>
+
+namespace sxml {
+
+element::element()
+{}
+
+element::element(const element &elem)
+ : m_children(elem.m_children),
+ m_attributes(elem.m_attributes),
+ m_name(elem.m_name),
+ m_text(elem.m_text)
+{}
+
+element::element(const std::string &name, const std::string &text)
+ : m_name(name),
+ m_text(text)
+{}
+
+std::string element::to_string(bool nice, int indent) const
+{
+ std::string xmlstr;
+ std::ostringstream xml(xmlstr);
+
+ if (nice)
+ xml << std::string(indent, ' ');
+
+ xml << "<" << m_name;
+
+ attribute_map::const_iterator ai = m_attributes.begin();
+ for (; ai != m_attributes.end(); ++ai)
+ {
+ xml << " " << ai->first << "=\"" << ai->second << "\"";
+ }
+
+ if (m_children.empty() && m_text.empty())
+ {
+ xml << " />";
+ return xml.str();
+ }
+ else if (nice)
+ {
+ xml << ">\n";
+ }
+ else
+ {
+ xml << ">";
+ }
+
+ if (!m_children.empty())
+ {
+ element_list::const_iterator ei = m_children.begin();
+ for (; ei != m_children.end(); ++ei)
+ {
+ xml << ei->to_string(nice, indent + 2);
+
+ if (nice)
+ xml << "\n";
+ }
+ }
+ else if (!m_text.empty())
+ {
+ if (nice)
+ xml << std::string(indent + 2, ' ');
+
+ xml << m_text << (nice ? "\n" : "");
+ }
+
+ if (nice)
+ xml << std::string(indent, ' ');
+
+ xml << "</" << m_name << ">";
+
+ return xml.str();
+}
+
+element &element::add_child(const element &child)
+{
+ m_children.push_back(child);
+ return *this;
+}
+
+element &element::set_text(const std::string &text)
+{
+ m_text = text;
+ return *this;
+}
+
+element &element::set_attr(const std::string &name,
+ const std::string &value)
+{
+ m_attributes[name] = value;
+ return *this;
+}
+
+element &element::set_attr(const std::string &name, long value)
+{
+ std::string s;
+ std::stringstream ss(s);
+ ss << value;
+ return set_attr(name, ss.str());
+}
+
+element &element::set_attr(const std::string &name, double value)
+{
+ std::string s;
+ std::stringstream ss(s);
+ ss << value;
+ return set_attr(name, ss.str());
+}
+
+} // namespace sxml
+