Re: Replacing text of a DOM text node
| From: | Frank Arensmeier | Date: | Wed, 07 Jun 2006 11:08:09 +0000 |
| Subject: | Re: Replacing text of a DOM text node | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-237548@lists.php.net to get a copy of this message | ||
Hello Rob.
Thank you very much indeed! Since this DOM thing is very new to me (well, maybe not the DOM concept but working with DOM function in PHP), I appreciate especially the links you provided.
Right now I am able to loop through all text nodes, replace certain characters and mark a column for translation so to say. And this is pretty much everything I needed to know in order to go on. One problem I definitely see coming up will be dealing with headers that have attributes like colspan or rowspan. But that's another story.
/frank
7 jun 2006 kl. 12.26 skrev Rob Richards:
Hi Frank, Frank Arensmeier wrote: Jochem, thank you for your input! So, right now I am able to access all text nodes by e.g. $nodeElement -> parentNode -> childNodes -> item(0); -> returns Lenght, Width and so on $nodeElement -> parentNode -> childNodes -> item(1); -> is empty $nodeElement -> parentNode -> childNodes -> item(2); -> returns mm, kg ... and so on. Or is there an easier way? When trying to acces the items by ($nodeElement containing text nodes) $nodeElemtent -> item(0); I get the following error message: Call to undefined method DOMText::item()... Only a nodelist and namenodemap has the item() method. You could also do something like the following - note that manually walking the tree is much faster than iterating a nodelist - (there are also many different variations of this code depending upon what you need to do with the subtree): $node = $nodeElement->parentNode->firstChild; while ($node) { /* only process text or element nodes here */ if ($node->nodeType == XML_TEXT_NODE) {$node->nodeValue = 'New text content'; /* modify text content */} else if ($node->nodeType == XML_ELEMENT_NODE) {/* node is element - process its subtree or move on i.e.: */ if ($node->hasChildNodes()) { foreach ($node->childNodes AS $child) { /* process child nodes here */ } }} $node = $node->nextSibling; } BTW, is there an easy way to get the total amount of items in a curent node? count ( $nodeElement -> parentNode -> childNodes ) always returns 1. For now the only solution I know of is looping through the nodeElements (e.g. foreach ( $nodeElement as $value ) and have a counter inside the loop. $count = $nodeElement->parentNode->childNodes->length; This property is only available from a nodelist or namednodemap. Thank you so far. /frank ps. I am desperately looking for some good sites covering the PHP DOM functions. On www.php.net/dom there are barely some examples. And on www.zend.com I only found one article with very, very basic examples. Any ideas/suggestions are more than welcome. ds. You can pretty much search for examples from any DOM implementation since its a standard (not too difficult to go from one language to another when using DOM). For PHP specific ones, there are a number of tests in the CVS repository that demonstrate much of the functionality: http://cvs.php.net/viewcvs.cgi/php-src/ext/dom/tests/ One particular test that uses a good amount of the API (though the basic functions) is dom001.phpt: http://cvs.php.net/viewcvs.cgi/php-src/ext/dom/tests/dom001.phpt?view=markup&rev=1.4 Rob --rrichards@ctindustries.net author of Pro PHP XML and Web Services from Apress --PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php