aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example.cpp48
-rw-r--r--sxml.cpp140
-rw-r--r--sxml.h91
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
+
diff --git a/sxml.h b/sxml.h
new file mode 100644
index 0000000..7b9ffc2
--- /dev/null
+++ b/sxml.h
@@ -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
+