"Change Set: xmlSearchFixes-mir Date: 11 March 2002 Author: Michael Rueger Published as 4850xmlSearchFixes-mir.cs to 3.3a. Fixes a problem with search functions. Renames the ivar entities to elements (thanks to Bijan Parsia) and does away with using associations there (thanks again Bijan)."! Smalltalk renameClassNamed: #XMLNodeWithEntities as: #XMLNodeWithElements! XMLNodeWithElements removeSelector: #addEntity:! XMLNodeWithElements removeSelector: #entities! XMLNodeWithElements removeSelector: #entitiesDo:! XMLNodeWithElements removeSelector: #entityAt:! XMLNodeWithElements removeSelector: #entityAt:ifAbsent:! XMLNode subclass: #XMLNodeWithElements instanceVariableNames: 'elements ' classVariableNames: '' module: #(XML Parser) ! !XMLNodeWithElements methodsFor: 'accessing' stamp: 'mir 3/6/2002 11:01'! addElement: element self elements add: element! ! !XMLNodeWithElements methodsFor: 'accessing' stamp: 'mir 3/6/2002 10:46'! elementAt: entityName ^self elementAt: entityName ifAbsent: [nil]! ! !XMLNodeWithElements methodsFor: 'accessing' stamp: 'mir 3/6/2002 10:46'! elementAt: entityName ifAbsent: aBlock elements ifNil: [^aBlock value]. ^self elements detect: [:each | each key = entityName] ifNone: [^aBlock value]! ! !XMLNodeWithElements methodsFor: 'accessing' stamp: 'mir 3/6/2002 10:54'! elements elements ifNil: [elements _ OrderedCollection new]. ^elements! ! !XMLNodeWithElements methodsFor: 'accessing' stamp: 'mir 3/6/2002 10:50'! topElement ^self elements first! ! !XMLNodeWithElements methodsFor: 'enumerating' stamp: 'mir 3/6/2002 10:45'! elementsDo: aBlock elements ifNotNil: [ self elements do: [:each | aBlock value: each]]! ! !XMLNodeWithElements methodsFor: 'printing' stamp: 'mir 3/6/2002 10:49'! printXMLOn: writer self elementsDo: [:element | element printXMLOn: writer]! ! !XMLDOMParser methodsFor: 'content' stamp: 'mir 3/6/2002 10:49'! processingInstruction: piName data: dataString | newElement | newElement _ XMLPI target: piName data: dataString. self top addElement: newElement! ! !XMLDOMParser methodsFor: 'content' stamp: 'mir 3/6/2002 10:49'! startElement: elementName attributeList: attributeList | newElement | newElement _ XMLElement named: elementName attributes: attributeList. self incremental ifFalse: [self stack isEmpty ifFalse: [self top addElement: newElement]]. self push: newElement! ! !XMLNode methodsFor: 'searching' stamp: 'mir 3/6/2002 10:52'! firstTagNamed: aSymbol "Return the first encountered node with the specified tag. Pass the message on" | answer | self elementsDo: [:node | (answer _ node firstTagNamed: aSymbol) ifNotNil: [^answer]]. ^nil! ! !XMLNode methodsFor: 'searching' stamp: 'mir 3/6/2002 10:53'! firstTagNamed: aSymbol with: aBlock "Return the first encountered node with the specified tag that allows the block to evaluate to true. Pass the message on" | answer | self elementsDo: [:node | (answer _ node firstTagNamed: aSymbol with: aBlock) ifNotNil: [^answer]]. ^nil! ! !XMLNode methodsFor: 'searching' stamp: 'mir 3/6/2002 10:53'! tagsNamed: aSymbol childrenDo: aOneArgumentBlock "Evaluate aOneArgumentBlock for all children who match" self elementsDo: [:each | each tagsNamed: aSymbol ifReceiverDo: aOneArgumentBlock]! ! !XMLNode methodsFor: 'searching' stamp: 'mir 3/6/2002 10:53'! tagsNamed: aSymbol childrenDoAndRecurse: aOneArgumentBlock "Evaluate aOneArgumentBlock for all children who match and recurse" self elementsDo: [:each | each tagsNamed: aSymbol ifReceiverDoAndRecurse: aOneArgumentBlock]! ! !XMLNode methodsFor: 'searching' stamp: 'mir 3/6/2002 10:53'! tagsNamed: aSymbol contentsDo: aBlock "Evaluate aBlock for all of the contents of the receiver. The receiver has no tag, so pass the message on" self elementsDo: [:each | each tagsNamed: aSymbol contentsDo: aBlock]! ! !XMLNode methodsFor: 'searching' stamp: 'mir 3/6/2002 10:53'! tagsNamed: aSymbol do: aOneArgumentBlock "Search for nodes with tag aSymbol. When encountered evaluate aOneArgumentBlock" self elementsDo: [:each | each tagsNamed: aSymbol do: aOneArgumentBlock]! ! !XMLNode methodsFor: 'searching' stamp: 'mir 3/6/2002 10:53'! tagsNamed: aSymbol ifReceiverDoAndRecurse: aOneArgumentBlock "Recurse all children" self elementsDo: [:each | each tagsNamed: aSymbol ifReceiverDoAndRecurse: aOneArgumentBlock]! ! !XMLNode methodsFor: 'searching' stamp: 'mir 3/6/2002 10:53'! tagsNamed: aSymbol ifReceiverOrChildDo: aOneArgumentBlock "Recurse all children" self elementsDo: [:each | each tagsNamed: aSymbol ifReceiverDo: aOneArgumentBlock]! ! !XMLNode methodsFor: 'enumerating' stamp: 'mir 3/6/2002 10:56'! elementsDo: aBlock! ! !XMLElement methodsFor: 'accessing' stamp: 'mir 3/6/2002 10:52'! contentStringAt: entityName ^(self elementAt: entityName ifAbsent: [^'']) string! ! !XMLElement methodsFor: 'testing' stamp: 'mir 3/6/2002 10:48'! isEmpty ^self elements isEmpty and: [self contents isEmpty]! ! XMLElement removeSelector: #elements!