diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2011-05-24 21:37:28 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2011-05-24 21:37:28 +0300 |
| commit | da95699c98034720e823f318cb724088fd09d8a9 (patch) | |
| tree | cbc89555067539e1bbcc37b06f40780461ad43f5 | |
| download | sxml-da95699c98034720e823f318cb724088fd09d8a9.tar.gz sxml-da95699c98034720e823f318cb724088fd09d8a9.zip | |
Initial commit
| -rw-r--r-- | example.cpp | 48 | ||||
| -rw-r--r-- | sxml.cpp | 140 | ||||
| -rw-r--r-- | sxml.h | 91 |
3 files changed, 279 insertions, 0 deletions
diff --git a/example.cpp b/example.cpp new file mode 100644 index 0000000..fa1574c --- /dev/null +++ b/example.cpp @@ -0,0 +1,48 @@ +/* + * 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 <iostream> + +#include "sxml.h" + +using sxml::element; + +int main() +{ + element root("summary"); + + root.add_child(element("foo", "lorem ipsum")) + + .add_child(element("bar") + .add_child(element("foobar", "bazinga!")) + .set_attr("id", "1337")) + + .add_child(element("mother").add_child(element("child"))); + + std::cout << root.to_string(true) << std::endl; + + return 0; +} + 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 + @@ -0,0 +1,91 @@ +/* + * 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. + */ + +#ifndef SXML_H +#define SXML_H + +#include <string> +#include <map> +#include <vector> + +namespace sxml { + +class element; + +typedef std::vector<element> element_list; +typedef std::map<std::string, std::string> attribute_map; + +class element +{ + public: + + //! Constructs an empty element (i.e., no name, + //! children, attributes). + element(); + + //! Copy constructor. + element(const element &elem); + + //! Construcst an element with the specified name and text. + element(const std::string &name, + const std::string &text = std::string()); + + //! Creates a textual representation of the element. If nice + //! is true, the returned string is formatted with indentations + //! and newlines. + std::string to_string(bool nice = false, int indent = 0) const; + + //! Adds a child element to this element. + element &add_child(const element &child); + + //! Set the text for this element. An element can either have text + //! or children. If an element has both, children take precedence + //! when calling to_string(). + element &set_text(const std::string &text); + + //! Set an attribute for this element with the specified name and + //! value. + element &set_attr(const std::string &name, + const std::string &value); + + //! This is an overloaded function. + element &set_attr(const std::string &name, long value); + + //! This is an overloaded function. + element &set_attr(const std::string &name, double value); + + private: + + element_list m_children; + attribute_map m_attributes; + + std::string m_name; + std::string m_text; +}; + +} // namespace sxml + +#endif // SXML_H + |
