From f0510d2f90467de8e8f260b47d79a9baaf9bef17 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 17 Sep 2009 07:15:29 +0200 Subject: Start tracking XSD with git --- libxsd/xsd/cxx/tree/text.txx | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 libxsd/xsd/cxx/tree/text.txx (limited to 'libxsd/xsd/cxx/tree/text.txx') 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 +// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include + +#include + +#include + +namespace xsd +{ + namespace cxx + { + namespace tree + { + template + std::basic_string + 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 (n)); + + // Berkeley DB XML DOM does not implement getLength(). + // +#ifndef DBXML_DOM + return xml::transcode (t->getData (), t->getLength ()); +#else + return xml::transcode (t->getData ()); +#endif + } + + std::basic_string r; + + for (; n != 0; n = n->getNextSibling ()) + { + switch (n->getNodeType ()) + { + case DOMNode::TEXT_NODE: + case DOMNode::CDATA_SECTION_NODE: + { + DOMText* t (static_cast (n)); + + // Berkeley DB XML DOM does not implement getLength(). + // +#ifndef DBXML_DOM + r += xml::transcode (t->getData (), t->getLength ()); +#else + r += xml::transcode (t->getData ()); +#endif + break; + } + case DOMNode::ELEMENT_NODE: + { + throw expected_text_content (); + } + default: + break; // ignore + } + } + + return r; + } + } + } +} -- cgit v1.1