Here is another variant that doesn't copy around the data as much.

const XMLCh*     DOMNodeImpl::getTextContent() const
{
  DOMNode *thisNode = castToNode(this);
  int nContentLength = 0;
  { // Get total length of content
    DOMNodeIteratorImpl nodeIterator(thisNode, 0x00000004, NULL, false); //
SHOW_TEXT
    DOMNode *currentNode = nodeIterator.nextNode();
    while (currentNode) {
      nContentLength += XMLString::stringLen(currentNode->getNodeValue());
      currentNode = nodeIterator.nextNode();
    }
  }

  // Allocate buffer
  XMLCh* pzContentStr = new XMLCh[nContentLength+1];
  *pzContentStr = 0;

  { // Fetch content
    DOMNodeIteratorImpl nodeIterator(thisNode, 0x00000004, NULL, false); //
SHOW_TEXT
    DOMNode *currentNode = nodeIterator.nextNode();
    while (currentNode) {
      XMLString::catString(pzContentStr, currentNode->getNodeValue());
      currentNode = nodeIterator.nextNode();
    }
  }

  return pzContentStr;
}

This of course forces the user to delete the returned string, which is
non-standard behavour.
BTW, this is completly untested code. It compiles but not more.

Regards

Erik Rydgren
Mandarinen systems AB
Sweden


-----Original Message-----
From: Andreļ V. FOMITCHEV [mailto:[EMAIL PROTECTED]
Sent: den 27 mars 2003 15:56
To: [EMAIL PROTECTED]
Subject: Re: Re: Getting text off all subnodes


a beginning:

String * XML::getTextContent(DOMNode * node)
{
  String * res = new String("");

  DOMNodeList * laListe = node->getChildNodes();
  DOMNode * noeud_courant;
  for(XMLSize_t i = 0; i < laListe->getLength(); i++)
     {
       noeud_courant = laListe->item(i);
       // NodeType
       switch(noeud_courant->getNodeType())
         {
         case DOMNode::ELEMENT_NODE:
           {
             printf("ELEMENT_NODE ");
             String * tampon = getTextContent(noeud_courant);
             *res += *tampon;
             delete tampon;
             break;
           }
         case DOMNode::ATTRIBUTE_NODE:
           //pas de contenu texte ...
           break;
         case DOMNode::TEXT_NODE:
           {

             char * tampon =
XMLString::transcode(noeud_courant->getNodeValue());
             printf("tampon = '%s'\n", tampon);
             if(tampon != NULL)
               *res += String(tampon);
             delete [] tampon;
             break;
           }
         case DOMNode::CDATA_SECTION_NODE:
         case DOMNode::ENTITY_REFERENCE_NODE:
         case DOMNode::ENTITY_NODE:
         case DOMNode::PROCESSING_INSTRUCTION_NODE:
         case DOMNode::COMMENT_NODE:
         case DOMNode::DOCUMENT_NODE:
         case DOMNode::DOCUMENT_TYPE_NODE:
         case DOMNode::DOCUMENT_FRAGMENT_NODE:
         case DOMNode::NOTATION_NODE:
         default :
           printf("Others: %d node\n", noeud_courant->getNodeType());
           break;
         }
     }
  return res;
}
where class String is a Al Dev's class.
This piece of code functions except with the accentuated letters (There
is always nobody to help me with the accents?).


Gareth Reakes wrote:

>Hi,
>       getTextContent does what you want but is unimplemented. If you
>decide to implement it then we will gladly accept your code :)
>
>Gareth
>
>
>
>
>On Thu, 27 Mar 2003, Magnus Strand wrote:
>
>
>
>>Hi,
>>
>>Is there a method to return all text merged from all text subnodes from
>>a certain nod in a DOM tree?
>>
>>I mean if i have this as part of an xml:
>><header>It is <b>sunny</b>weather today</header>
>>
>>I have a DOMNode* to the header element and would like to return all the
>>text:
>>"It is sunny weather today"
>>
>>Regards,
>>Magnus Strand
>>
>>
--
Andreļ V. FOMITCHEV               [Quand faut-il arrźter l'informatique]
Software R&D Engineer    [Lorsque, dans un kilo, on trouve 1024 grammes]
Odixion, FRANCE




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to