(name 'XML-Parser-DamienPollet.75' message 'Failing test for UTF-8 entities decoding.' id 'c42f2f2a-bdb1-4a07-a32b-b30f25c68ffa' date '16 May 2010' time '7:27:31 pm' author 'DamienPollet' ancestors ((name 'XML-Parser-Alexandre_Bergel.74' message 'Added log in benchmark1' id 'd4a68b46-39ad-4585-b77a-706b62226c1f' date '29 March 2010' time '9:10:50 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-AlexandreBergel.73' message 'Added new UTF8 test using the file provided by nernan Morales Durand' id '770249f4-7b8b-4bec-9250-097feaae02e0' date '29 March 2010' time '9:08:30 am' author 'FirstnameLastname' ancestors ((name 'XML-Parser-JAAyer.72' message '* Balanced #nextMatchAll: to use the old optimization of resetting the stream position to where the match was first attempted where possible, but in such a way that it won''t cause problems with MultiByteFileStreams.' id 'a1adc2a9-3395-4118-ade9-4f888ace5188' date '28 March 2010' time '1:31:04 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.71' message '* Changed #nextMatchAll: to not use #position/#position:, as this causes problems with MultiByteFileStreams.' id '1a45aeae-30e3-45e2-a0b2-8e226650d380' date '28 March 2010' time '12:22:03 am' author 'JAAyer' ancestors ((name 'XML-Parser-FirstnameLastname.70' message 'small test non non utf8 characters' id '5114e7e6-77a5-449b-a2c5-43a17b4b8576' date '26 March 2010' time '6:22:40 pm' author 'FirstnameLastname' ancestors ((name 'XML-Parser-FirstnameLastname.69' message 'small test non non utf8 characters' id 'f9cd9cd6-3bf4-4e63-8d46-3eaf57c6ed16' date '26 March 2010' time '6:21:42 pm' author 'FirstnameLastname' ancestors ((name 'XML-Parser-JAAyer.68' message '* Adjusted the #startElement- and #endElement- handlers. They now all expect the full, qualified name as their first argument.' id '0f4ab344-2583-4a7b-8aaa-443b83785124' date '24 March 2010' time '7:35:08 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.67' message '* Added #innerXML:.

* Added XMLStreamWriter to manage the multiple WriteStreams needed by XMLTokenizer.' id 'a64d3a67-86b1-4734-a19d-17aac2f42ee5' date '23 March 2010' time '6:13:29 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.66' message '* The well-formedness checking has been moved out of XMLDOMParser and into SAXDriver. It throws SAXNotWellFormedExceptions when tags are closed out of order or if tags are still left open after parsing has finished.

* The tokenizer and stream reader have both been refactored and optimized.

* Removed XMLParser. SAXDriver/SAXHandler do everything it does, and more.

* Renamed XMLStringNode to XMLString.

* Added XMLOrderedList and a subclass, XMLElementList, and also made XMLNodeList inherit from it. XMLOrderedList and its subclasses will never throw exceptions when non-existent elements are accessed; instead they return nil. This means code like this: "(doc root elementsAt: ''foo'') third" will work, even if there is no third element named "foo," returning nil in such situations.' id '32618415-85b8-4e67-b440-f523ba6091fe' date '23 March 2010' time '1:52:21 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.65' message 'empty log message' id 'e9ea7108-9250-4e58-a40a-b008c2756a80' date '22 March 2010' time '8:25:47 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.64' message 'empty log message' id '6147738e-ddb4-400c-a2c1-5879895525a8' date '22 March 2010' time '11:33:56 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.63' message 'empty log message' id 'aa238952-5ee5-497d-9c14-4d0411cec373' date '19 March 2010' time '2:30:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.61' message 'empty log message' id '158add99-5c12-4112-844a-b1ae9d3f174f' date '17 March 2010' time '3:23:12 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.60' message 'empty log message' id 'd287422a-f317-42e4-a741-c110989157eb' date '16 March 2010' time '3:55:17 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.59' message 'empty log message' id 'd06f93cb-7fd0-4148-8c6b-48933406e23f' date '15 March 2010' time '4:44:16 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.58' message 'empty log message' id '0bd27681-93c7-4e45-8b2e-96818509c471' date '12 March 2010' time '10:35:50 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.57' message '' id '99388deb-5dcd-4537-8d5c-aa95268a1709' date '12 March 2010' time '1:02:28 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.56' message '* Removed the newly-added *content: constructors for XMLElement. Since #addContent: can take strings, they aren''t really needed anymore.

* Refactored the stream reading code out of XMLTokenizer and into a separate XMLStreamReader class.

* Added some new exception classes.

* Added constructor methods to XMLElement to support creating an element with multiple namespaces declared it it, and also added an instance-side declareNamespaces: message.

* Attributes can now be supplied as a Dictionary or Array to XMLElement constructors (so too with namespaces).' id '4e1fa747-d9c0-443d-956d-1b8c0768246f' date '11 March 2010' time '10:20:49 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.55' message 'empty log message' id '4b81c2ce-a911-4c60-a1c7-10764b460b8f' date '11 March 2010' time '1:56:03 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.53' message '* Adjusted the class hierarchy.

* Added two XMLNode-specific collection classes, XMLNodeList and XMLAttributeList.' id 'cb191763-8883-4f97-8322-17f5db923331' date '10 March 2010' time '11:47:53 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.52' message 'empty log message' id 'c5228c52-7fd2-4f31-beac-853aee9af710' date '10 March 2010' time '11:01:57 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.51' message 'Minor fixes and refactorings.' id 'a34b5fa4-cef9-4d8a-8785-8da34615bd7d' date '9 March 2010' time '12:07:34 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.50' message '* The API is now completely string-based. The performance of the symbol-based predecessors was erratic and could potentially cause portability issues. Existing code in Squeak and Pharo shouldn''t be affected, as they both assume #name = ''name''.

* Added XMLNodeWithChildren and refactored all node-related methods out of XMLNodeWithElements and into XMLNodeWithChildren, of which XMLNodeWithElements is now a subclass.

* Element attributes are now represented as XMLAttribute nodes and stored in an XMLAttributeList. They now also support namespacing.

* Attribute order is preserved at all levels.

* The tokenizer (#basicNext in particular) has been sped up.' id 'cd8217d9-84c7-4b36-8ae1-c1b7db949b8c' date '9 March 2010' time '1:08:35 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.49' message 'empty log message' id 'f294ee76-7258-4d99-ae07-c39b1e27786f' date '8 March 2010' time '11:53:46 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.47' message 'empty log message' id 'f50149a3-9e82-49b0-913b-b0c492b31873' date '7 March 2010' time '9:05:36 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.46' message 'Added an elementary benchmark' id 'ace3bc7f-9c6d-4bad-8a4b-aa748164ff41' date '4 March 2010' time '3:04:34 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.45' message 'Following Nobert''s suggestion, I replaced the reference of IdentityDictionary by ''anElement attributes species'' in ''#assertElement: anElement attributes: aDictionary''. All tests are green' id '12286457-2f48-41a5-a675-026eecc54432' date '4 March 2010' time '2:46:15 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.44' message 'Minor fix' id '6f0b9b1f-0135-46e3-bc43-5e7c041de697' date '4 March 2010' time '2:37:48 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-JAAyer.43' message '* Added full namespace support for elements. Evaluate this: (XMLDOMParser parse: ''<foo:root xmlns:foo="http://foo" xmlns="http://default"><bar>test</bar></foo:root>'') in a Workspace with cmd-p, and you should get back out roughly what you put in. When you add an element to another, it and its descendants inherit the parent''s bindings. When you change the binding of a prefix, all descendants with the old bindings are rebound.

* Removed #parseWithNamespaces: and changed #parseDocumentFrom: (and #parse: by extension) to default to usesNamespaces=true. The reason for turning off namespace support by default was that the old, broken way of handling namespaces used expanded names (namespace URI + local name) as qualified names (prefix + local name) for elements that lacked a prefix and also assumed a global, default namespace (the URI of the namespace spec itself) for no apparent reason.

* Added #elementsAt:do: and deprecated #tagsNamed:childrenDo:. Now all undeprecated #tagsNamed: messages do some sort of depth-first traversal using #recurse: and all #element- messages operate on direct child elements; the naming convention is consistent.' id '7164e5b6-8364-49d6-afac-ef4c2451916f' date '4 March 2010' time '1:21:30 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.40' message '* Added full namespace support for elements. Evaluate this: (XMLDOMParser parse: ''<foo:root xmlns:foo="http://foo" xmlns="http://default"><bar>test</bar></foo:root>'') in a Workspace with cmd-p, and you should get back out roughly what you put in. When you add an element to another, it and all its descendants inherit the parent''s bindings. When you change the binding of a prefix, all descendants with the old bindings are rebound.

* Removed #parseWithNamespaces: and changed #parseDocumentFrom: (and #parse: by extension) to default to usesNamespaces=true. The reason for turning off namespace support by default was that the old, broken way of handling namespaces used expanded names (namespace URI + local name) as qualified names (prefix + local name) for elements that lacked a prefix and also assumed a global, default namespace (the URI of the namespace spec itself) for no apparent reason.

* Added #elementsAt:do: and deprecated #tagsNamed:childrenDo:. Now all undeprecated #tagsNamed: messages do some sort of depth-first traversal using #recurse: and all #element- messages operate on direct child elements; the naming convention is consistent.' id '91396896-8444-4d6c-bd4d-c9c2269c97ce' date '4 March 2010' time '12:41:06 am' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.39' message 'modified allAttributes and added allAsttributeAssociations as follows:
XMLElement>>allAttributes
	^ self attributes keys
	
XMLElement>>allAttributeAssociations
	^ self attributes associations



Tested in testParsing as:
	self assert: (firstPerson allAttributes = #(#''first-name'' #''employee-number'' #''family-name'')).
	self assert: firstPerson allAttributeAssociations asArray = {(#''first-name''->''Bob''). (#''employee-number''->''A0000''). (#''family-name''->''Gates'')}.
' id '2ecce43a-f0b1-447e-a779-ebc908dc6f7d' date '2 March 2010' time '12:21:46 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.38' message 'improvement proposed by JAAyer. Thanks!


Here is the list of improvements.

This update includes features, refactoring, and at least one bug fix.

To begin with, I realized there was a problem with the #= messages from the last package. This code will demonstrate:

doc := (XMLDOMParser parseDocumentFrom: ''<r><a>foo</a><b>bar</b><a>foo</a></r>'').
doc root removeElement: doc root elements last.

That removes the *first* <a> element, not the last, as both <a>s are equal according to #=, and #remove: (used by #removeElement:) removes the first object equal (#=) to its argument. I identified three possible solutions. The first would be to just ignore it. The second would be to remove the #= (and #hash) messages. The third would be to rewrite methods whose behavior depends on #= to depend instead on #== if to do otherwise would result in unexpected behavior (like in the code above). I initially opted for #3, but quickly realized code like this: "self elements removeAt: (self elements identityIndexOf: anElement)" would probably confuse future maintainers. I have chosen instead to just delete all #=/#hash messages. You can still compare documents and elements by sending them #asString and testing the results with #=. I added an #equalTo: message to XMLNodeWithElements that does just that.

Other changes:

* Added a comprehensive TestCase for XMLNode and its subclasses, XMLNodeTest.

* Child elements now properly notify their parents of name/namespace changes, and the qualified and unqualified names of elements are both cached as symbols.

* Added #nextNode/#previousNode and #nextElement/#previousElement to facilitate accessing siblings nodes/elements.

* Added #addNode:after:, #addNode:before: and #addNodeFirst:, and renamed #addAll: to #addNodes: and #removeAll to #removeNodes. Also added #removeNodes:. These methods return the node(s) added or removed.

* Refactored code out of #addElement: and #removeElement:, so they are no longer needed. The former is still kept for backwards compatibility and returns self. #addNode: and #removeNode: should be used instead.

* Previously #topElement would, because it sends #first to #elements, raise an unintuitive error when #elements is empty. It now returns nil in such circumstances. Added #topNode to complement it.

* Added #firstTagNamedAny:, #firstTagNamedAny:with:, #elementAtAny:, and #elementAtAny:ifAbsent:.

* #tagsNamed:ifReceiverDoAndRecurse:, #elementUnqualifiedAt:, #elementUnqualifiedAt:ifAbsent:, #valueFor:, and #valueFor:ifAbsent: are all redundant and have been marked deprecated accordingly.

* Added #parse: and #parseWithNamespaces: to XMLDOMParser. Since #parseDocumentFrom: and #parseDocumentFrom:useNamespaces: are sent so often, there should be shortcuts.

* SAXDriver now properly sends #startCData before invoking #characters: with CDATA and #endCData after. I actually toyed briefly with adding an XMLCDataNode class as other XML APIs have, but I honestly can''t see any benefit to doing so.

* I inserted class comments into XMLParser, SAXDriver, SAXHandler and XMLDOMParser.

* There are now two execute-around methods, #with:add: and #with:remove:, that take blocks that either add a node to #nodes or remove one from it. They handle establishing and breaking parent-child relationships, keeping the element cache up-to-date, and also catching corner-case issues like adding the same node twice or adding a node that is already the child of another node. To write methods that modify #nodes, you need only wrap the modifying code in #with:add: or #with:remove, and they will take care of the rest.

* Refactored some of my code from the previous package. It should be easier to follow now. Renamed #elementsDictionary to #elementsByName, and the private methods that manipulate #elements and #elementsByName now have an #elementCache* prefix.

* XMLElement attributes are stored as an IdentityDictionary, but the methods that access it directly by key send asSymbol to the key first, so the change is unlikely to break anything.

' id 'e5da0293-64a9-456a-b318-05618f422fdf' date '27 February 2010' time '11:46:22 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-JAAyer.37' message 'empty log message' id 'cfb0ac47-33d8-442c-8bf3-ca7037c12ffa' date '26 February 2010' time '11:27:36 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.30' message 'remove the dependency with ClassTestCase.
This will ease the porting to Gemstone' id 'cefc8e10-5cf9-4234-b8ac-c43df916b76d' date '26 February 2010' time '5:37:10 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.29' message 'A bit of cleaning
Added extra test for the tokenizer
Added asSymbol when looking up attributes' id '86bb21f3-db73-401f-b0bd-d23e03461259' date '24 February 2010' time '11:26:36 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.29' message 'A bit of cleaning
Added extra test for the tokenizer
Added asSymbol when looking up attributes' id 'c9109661-ede2-465e-97c0-89c6da3f0c15' date '24 February 2010' time '11:25:55 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.28' message 'Recategorization' id '9ef076c5-f3c4-4809-a178-ba43e599be84' date '17 February 2010' time '4:46:08 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.27' message 'Improvement by george.herolyants@gmail.com
regarding line ending' id 'fcebd958-dc85-49f7-a764-790187e8e085' date '17 February 2010' time '4:31:36 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.26' message 'Improvements proposed by jaayer@zoho.com


* All searching and enumerating methods have been moved from XMLNode to XMLNodeWithElements. Unless you can think of a scenario where it would make sense to send any of them to a string or PI node, I think this is both a safe and sensible move.

* XMLNodeWithElements no longer contains an "elementsAndContents" collection. Instead it has a single "nodes" OrderedCollection that contains all child nodes in the order in which they appeared. The collection returned by #elementsAndContents (and enumerated via #elementsAndContentsDo:) is recreated using #nodes.

* #addElement: is now just for elements, and #addNode can be used for everything else (#addElement can still handle non-element nodes, though). #removeNode: and #removeElement: have also been added. Since, for backwards compatibility, the #add* methods don''t return the object added, neither will the #remove* method return that which was removed.

* Because the costly depth-first traversing #firstTag* and #tagsNamed* methods send #elementsDo: so many times, it makes sense to speed-up #elementsDo: by having it enumerate a separate collection just containing elements; thus, an "elements" collection has been added for that purpose. The repetitive identity checks in the XMLElement versions of those methods have been moved into a single #isNamed: method, which expects a symbol but can also handle strings by sending its argument #asSymbol before making #== comparisons. (#asSymbol is free for symbols, so you only pay if you use strings to specify tag names.)

* #tagsNamed:ifReceiverDo:, despite what its name implies (the plural "tags"), does no searching/enumeration. Outside of the implementations of other #tagsNamed:* messages, I doubt anyone uses this, so I have renamed it #ifNamed:do:.

* #tagsNamed:ifReceiverOrChildDo: does not work. The XMLElement version evaluates the block if it is so named and then invokes the superclass version of #tagsNamed:ifReceiverDo:, which is an empty method. Since it doesn''t work and is ridiculously named, I have removed it.

* #tagsNamed:ifReceiverDoAndRecurse: is, oddly enough, exactly equivalent to #tagsNamed:do:. I have removed the XMLElement version and reimplemented the XMLNode(WithElements) version to just send #tagsNamed:do: (although I''d prefer to remove it altogether).

* XMLNodeWithElements has a new instance variable: "elementsDictionary," an IndentityDictionay where keys are the qualified and unqualified names of child elements and values are OrderedCollections of so-named elements. This makes #elementAt: have O(1) complexity rather than O(n) and a->b->c traversal have O(n) complexity (where n is the number of nodes counting the root, the target, and all ancestors between) rather than the previous worst-case of O(n^2). This comes at the cost of additional memory and time to add/remove elements. You can rewrite Pastell accessors in terms of #elementsAt: and #elementAt:.

* The #contentsDo: and #elementsAndContentsDo: messages can now only be sent to XMLElements. It makes no sense to send them to documents or other kinds of nodes, as no other kind of node has text content. 

* I moved #parent and #parent: out of XMLNodeWithElements and put them in XMLNode instead, as every node in the DOM tree save the root has a parent. They actually work now, too, meaning that "((XMLDOMParser parseDocumentFrom: ''<p>foo<b>bar</b></p>'' readStream) firstTagNamed: #b) parent" will return the "p" element, not nil as it would before.

* How often have you sent #parseDocumentFrom: with an XML string as its argument (instead of a stream) and gotten a "message not understood" error? XMLDOMParser''s #parseDocumentFrom:useNamespaces: method now sends #readStream to "aStream" if it is not already a stream, so you will no longer receive such errors.

* #addEntity:value: has been removed. It has not been touched in ten years and sends a message (#entities) that is not understood.

* Confusing "entityName" parameter names in methods expecting element/tag names were replaced with "aSymbol."

* (This package also contains the #=/#hash methods submitted as a feature addition to bugs.squeak.)

Lastly, this codebase has had too many hands touching it and looks too inconsistent. I suggest configuring your formatter like so:

RBConfigurableFormatter
    maxLineLength: 80;
    newLinesAfterMethodPattern: 2;
    newLinesAfterMethodComment: 2;
    retainBlankLinesBetweenStatements: true;
    stringInsideBlocks: ''''.

And then reformatting XMLNode and its subclasses.<XML-Parser-JAAyer.25.mcz>
' id '30096ce3-84d4-442e-be07-04bdf5519131' date '17 February 2010' time '3:05:06 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-JAAyer.25' message 'empty log message' id '1c7e0d7d-31d0-4c49-8694-4c823a63d744' date '15 February 2010' time '12:47:59 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.24' message 'empty log message' id 'bad20136-a096-4b1a-ac22-b5c50a3b4027' date '15 February 2010' time '12:41:18 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.23' message 'empty log message' id 'dc20f9d2-55ce-477b-b970-8fa29921e224' date '15 February 2010' time '11:30:50 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.22' message 'empty log message' id '708b3609-6172-451a-adf7-ed12896cd6b3' date '15 February 2010' time '8:49:57 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.21' message 'empty log message' id '5200e3fd-4d92-4e7b-97b6-bebb3346a9ff' date '14 February 2010' time '9:32:11 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.20' message 'improved:
XMLElement>>at: aSymbol
    ^ self attributeAt: aSymbol ifAbsent: ['''']

Thanks goes to J. A. Ayer' id 'd08d8266-6ec2-4ef8-9340-95c1a9e40b29' date '21 January 2010' time '10:31:56 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.20' message 'improved:
XMLElement>>at: aSymbol
    ^ self attributeAt: aSymbol ifAbsent: ['''']

Thanks goes to J. A. Ayer' id '6959f5c1-ad74-4698-bf08-95fcb9956867' date '21 January 2010' time '10:15:16 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.19' message 'Minor change in XMLElement>>contentString.
' id 'a8fe6c4d-fa69-4921-8ef5-f939749ee78b' date '26 November 2009' time '5:46:02 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.18' message 'Minor change in XMLElement>>contentString.
' id '18b81684-ce78-400f-84ff-b8fecce203a8' date '26 November 2009' time '5:45:31 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.17' message 'added some accessing methods. These methods are used by Pastell' id 'fa3a8d81-25f6-4ec3-9c3e-db3fab6a94c5' date '1 June 2009' time '10:34:41 am' author 'Alexandre.Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.16' message 'Added a comment in XMLParser' id '8e4d0555-50fc-4fb9-95f1-26ab6c40dfd8' date '1 June 2009' time '10:05:30 am' author 'Alexandre.Bergel' ancestors ((name 'XML-Parser-AlexandreBergel.15' message 'Added a class XMLParserTest' id '534ddcca-c33e-4e81-8b5d-78e29523b8bf' date '29 January 2009' time '2:39:56 pm' author 'AlexandreBergel' ancestors ((name 'XML-Parser-mir.14' message 'fixed contentsDo:' id '6539d61e-ed4a-9244-8b85-c4e5417bbeb1' date '3 January 2008' time '2:29:51 pm' author 'mir' ancestors ((name 'XML-Parser-mir.13' message 'added support for Pastell/XPath access (parent)' id '3da00a19-4cc5-cb49-9ef7-b40699f964a2' date '29 November 2007' time '2:46:38 pm' author 'mir' ancestors ((name 'XML-Parser-mir.12' message 'fixed issues with entity expansion and parsing of nested streams' id 'a8ef7705-934c-e54f-9fea-17e07f008132' date '23 November 2007' time '8:06:23 pm' author 'mir' ancestors ((name 'XML-Parser-mir.11' message 'fixed addElement:
changed elements inst var to elementsAndContents to avoid confusion.' id '130566fb-ad3a-de43-abb3-4a56c6e3e23d' date '14 November 2007' time '5:31:48 pm' author 'mir' ancestors ((name 'XML-Parser-mir.10' message 'Fixed a number of issues (see below) and converted _ to :=.

There are two major changes in this version:
whitespace handling and the unification of elements and contents.
For backward compatibility elements and contents methods preserve their semantics.
elementsAndContents and elementsAndContentsDo: access the new unified collection

Some of the fixes rely on fixes in 3.8.2 or 3.10, most prominently 
String class>>findFirstInString:inSet:startingAt:

http://bugs.squeak.org/view.php?id=32
http://bugs.squeak.org/view.php?id=33
http://bugs.squeak.org/view.php?id=34
http://bugs.squeak.org/view.php?id=547
http://bugs.squeak.org/view.php?id=888
http://bugs.squeak.org/view.php?id=928
http://bugs.squeak.org/view.php?id=3082
http://bugs.squeak.org/view.php?id=3083
http://bugs.squeak.org/view.php?id=6746

' id '9bd978ae-8e19-4946-90f6-5f01ae28567c' date '31 October 2007' time '6:39:12 pm' author 'mir' ancestors ((name 'XML-Parser-mir.9' message 'language environment fix based on a fix by [:masashi | ^umezawa]' id '83b817db-e1bf-5849-aba6-b7c5c0d28b74' date '14 July 2006' time '11:58:32 am' author 'mir' ancestors ((name 'XML-Parser-mir.8' message 'unicode fix from [:masashi | ^umezawa] 
example fix
added namespace aware parser invocations
indenting XMLWriter
lazy init for attributes' id 'afc3bcf2-bac2-bb4b-b17c-7f3a47d1564e' date '14 July 2006' time '11:32:37 am' author 'mir' ancestors ((name 'XML-Parser-bf.7' message '- fix reading whitespaces in closing tag' id 'b03ed7b2-d6ce-11da-9220-000d93ca8ba0' date '28 April 2006' time '5:50:16 pm' author 'bf' ancestors ((name 'XML-Parser-thf.6' message 'should now work clean with encoding Settings' id '490456fd-4f78-ee4c-b4ab-5b1376ee5cf5' date '3 February 2006' time '2:38:29 pm' author 'thf' ancestors ((name 'XML-Parser-thf.5' message '' id '817bbe38-4e92-4d6a-a8e1-daf812ed7567' date '7 September 2005' time '1:28:28 pm' author 'thf' ancestors ((name 'XML-Parser-thf.4' message 'set Encoder for XMLWriter' id '959e9e51-7af2-4634-ad91-d1f32e811c5f' date '1 September 2005' time '3:45:41 pm' author 'thf' ancestors ((name 'XML-Parser-thf.3' message 'sets encoding for Files in Squeak 3.8' id 'c3c3927d-8d5c-41c5-bb52-df8065d5d727' date '31 August 2005' time '12:17:02 pm' author 'thf' ancestors ((name 'XML-Parser-mir.2' message 'Yaxo 2.1 release' id 'fcd07bb1-1c15-2f48-92a3-b0aedaaf24a9' date '22 December 2004' time '11:14:33 am' author 'mir' ancestors ((name 'XML-Parser-mir.1' message 'Yaxo release 2.1' id '9be3532f-fdab-d54d-bc58-84e96735340c' date '22 December 2004' time '10:32:36 am' author 'mir' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-mir.3' message 'Yaxo 2.2 release

with fixes by 
umejava@mars.dti.ne.jp (unicode)
mas@wellthot.com (attribute init)
nika.nospam@kassube.de (dom parser example)' id 'ad602358-9389-be47-bcdf-a6343b00b955' date '19 December 2005' time '4:17:02 pm' author 'mir' ancestors ((id 'fcd07bb1-1c15-2f48-92a3-b0aedaaf24a9')) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-JAAyer.2' message 'empty log message' id '3d72c1fc-082d-49b8-ab01-0dd17aae834a' date '14 February 2010' time '8:24:39 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.1' message 'empty log message' id '2c6605c5-4d63-43e9-b08e-c19b079fce7c' date '14 February 2010' time '8:15:03 pm' author 'JAAyer' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-GeorgeHerolyants.21' message 'Writer fixed in order to make output more readable (use message #prettyPrint to enable this).' id '6009a1d8-4fcd-8946-8d5b-7294b2ab2f4b' date '10 January 2010' time '8:37:54 pm' author 'GeorgeHerolyants' ancestors ((name 'XML-Parser-GeorgeHerolyants.20' message 'Parser fixed to perform line endings normalization accordingly to the XML specification; test proposed by Avi Bryant added (see this thread http://aspn.activestate.com/ASPN/Mail/Message/squeak/1750442). ' id 'c2f734ef-ec77-f244-861d-41d2dd496053' date '9 January 2010' time '11:56:50 pm' author 'GeorgeHerolyants' ancestors ((id 'a8fe6c4d-fa69-4921-8ef5-f939749ee78b')) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-JAAyer.36' message 'empty log message' id '5b5789a3-2ea6-4caa-a401-2b952ce9c6a3' date '26 February 2010' time '11:24:16 pm' author 'JAAyer' ancestors ((name 'XML-Parser-NoBlankLineAfterSignature.34' message 'empty log message' id 'db37873f-8ea5-4139-9bbe-b2d6f8d7c0b1' date '25 February 2010' time '2:40:31 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.33' message 'empty log message' id 'edaca8c0-6fb4-474e-869b-d6022906820c' date '23 February 2010' time '6:03:46 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.32' message 'empty log message' id '3035573d-5817-4c24-8ab3-a10aa9b58b31' date '21 February 2010' time '10:31:29 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.31' message 'empty log message' id 'f3814ba1-1c5e-43df-9528-bfd546326b94' date '20 February 2010' time '9:29:38 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.30' message 'empty log message' id 'd8e3427f-ebae-4192-a45a-29ee22e3d3ae' date '18 February 2010' time '10:09:37 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.29' message 'empty log message' id '5dd97371-5d93-4ee3-82b6-5fd9a653e553' date '18 February 2010' time '9:55:46 pm' author 'JAAyer' ancestors ((id '9ef076c5-f3c4-4809-a178-ba43e599be84')) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-Alexandre_Bergel.41' message 'minor fix in a test method' id '6851179c-6087-47fe-b0f4-11d3bfb2da55' date '3 March 2010' time '4:48:24 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.40' message 'minor fix in a test method' id '767c6436-afcb-4471-8977-acb74074567a' date '3 March 2010' time '4:47:24 pm' author 'Alexandre Bergel' ancestors ((id '2ecce43a-f0b1-447e-a779-ebc908dc6f7d')) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(id 'ace3bc7f-9c6d-4bad-8a4b-aa748164ff41')) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(id '99388deb-5dcd-4537-8d5c-aa95268a1709')) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())