summaryrefslogtreecommitdiff
path: root/libxsd/xsd/cxx/tree/text.txx
diff options
context:
space:
mode:
Diffstat (limited to 'libxsd/xsd/cxx/tree/text.txx')
-rw-r--r--libxsd/xsd/cxx/tree/text.txx77
1 files changed, 77 insertions, 0 deletions
diff --git a/libxsd/xsd/cxx/tree/text.txx b/libxsd/xsd/cxx/tree/text.txx
new file mode 100644
index 0000000..97e78ec
--- /dev/null
+++ b/libxsd/xsd/cxx/tree/text.txx
@@ -0,0 +1,77 @@
+// file : xsd/cxx/tree/text.txx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xercesc/dom/DOMText.hpp>
+
+#include <xsd/cxx/xml/string.hxx>
+
+#include <xsd/cxx/tree/exceptions.hxx>
+
+namespace xsd
+{
+ namespace cxx
+ {
+ namespace tree
+ {
+ template <typename C>
+ std::basic_string<C>
+ text_content (const xercesc::DOMElement& e)
+ {
+ using xercesc::DOMNode;
+ using xercesc::DOMText;
+
+ DOMNode* n (e.getFirstChild ());
+
+ // Fast path.
+ //
+ if (n != 0 &&
+ n->getNodeType () == DOMNode::TEXT_NODE &&
+ n->getNextSibling () == 0)
+ {
+ DOMText* t (static_cast<DOMText*> (n));
+
+ // Berkeley DB XML DOM does not implement getLength().
+ //
+#ifndef DBXML_DOM
+ return xml::transcode<C> (t->getData (), t->getLength ());
+#else
+ return xml::transcode<C> (t->getData ());
+#endif
+ }
+
+ std::basic_string<C> r;
+
+ for (; n != 0; n = n->getNextSibling ())
+ {
+ switch (n->getNodeType ())
+ {
+ case DOMNode::TEXT_NODE:
+ case DOMNode::CDATA_SECTION_NODE:
+ {
+ DOMText* t (static_cast<DOMText*> (n));
+
+ // Berkeley DB XML DOM does not implement getLength().
+ //
+#ifndef DBXML_DOM
+ r += xml::transcode<C> (t->getData (), t->getLength ());
+#else
+ r += xml::transcode<C> (t->getData ());
+#endif
+ break;
+ }
+ case DOMNode::ELEMENT_NODE:
+ {
+ throw expected_text_content<C> ();
+ }
+ default:
+ break; // ignore
+ }
+ }
+
+ return r;
+ }
+ }
+ }
+}