From: Siddharth Karandikar Date: 2006-12-13T20:15:09+09:00 Subject: Re: hpricot selective text modification Thanks Peter. I need to improve my knowledge abt DOM in general. I have modified the code and do "if p.instance_of? Hpricot::Elem and ...." Right now, Its working fine for me. Still need to think abt all the possible cases. Thanks, Siddharth On Dec 13, 3:55 pm, Peter Szinek wrote: > > Am I making any mistake?Sure :). > > Some W3C DOM theory: > > A document consists of different Nodes - in practice subclasses of Node: > Element, Document, Attribute, Comment, Text, ProcessingInstruction etc > (just from the top of my head - there are some more like > DocumentFragment , CData, ... but it is unlikely you will need them > here). Not every Node has a name, or children, or parent, or xxx. You > have to make sure that the subclass of Node you are talking to is > actually responding to a method you are trying to send him. > > a Hpricot DOM is not exactly a W3C DOM, but it is mostly similar: > > Only HPricot::Element has children, (not HPricot::Document or > HPricot::Comment or...) and also not every Node has a name - like in > your example HPricot::Document (Similarly HPricot::Text or > HPricot::Comment does not have a name...). Also A HPricot::Document does > not have a parent I think. > > Your problem is that you are traversing up, and reach the Document node > which does not have a method name. > > So you have to modify your code like this: > > if text.parent and text.parent.name and text.parent.name != 'java' and > > to > > parent = text.parent > if (parent.instance_of? Hpricot::Text) #or with respond_to, or with > parent.parent == nil > #do the stuff > else > #you have reached the top Node - Document; nothing to do > end > > (The else branch is not needed, I just added it for illustration) > > HTH, > Peter > > __http://www.rubyrailways.com