// file : xsd/cxx/tree/text.txx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2011 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; } } } }