diff options
Diffstat (limited to 'sxml.cpp')
| -rw-r--r-- | sxml.cpp | 140 |
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 + |
