(name 'XML-Parser-OttoBehrens.125' message 'Some GS errors fixed' id '17e12b0d-a867-4fa6-bb7c-17a8045db3a6' date '16/02/2011' time '6:38:32 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.124' message 'Changed XMLOrderedList to be an OrderedCollection because of XMLOrderedList test failures. The reason was the difference between (OrderedCollection new: 5) size = 0 and (Array new: 5) size = 5. XMLOrderedList assumed the behaviour of Array but used OrderedCollection in stead.' id 'f1d66618-1a71-481d-ba00-f4546920d457' date '16/02/2011' time '6:07:40 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.123' message 'deprecated api removed. better to just keep it deprecated?' id '60fba67a-deda-4bdf-8e16-3dcadafe8e41' date '16/02/2011' time '3:07:02 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.122' message 'merge back in' id '959106b8-813e-4a43-a66a-dd7a6d76ab1c' date '16/02/2011' time '9:29:04 am' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.121' message 'Got some tests to pass' id '675f9eb8-a274-451f-8a7f-c63f8d03a7e7' date '14/02/2011' time '11:13:13 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.120' message 'more traits removed' id '4ed7ff59-2cd8-4932-96f8-349ad8aac2aa' date '' time '8:39:40 am' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.119' message 'removed more observable trait references' id '89db215d-4b95-4e99-919d-15fdec795040' date '' time '8:24:04 am' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.118' message 'removed rubbish ' id 'b352eb9d-f6d4-4bc7-99df-e9a89d26d6ed' date '' time '5:45:17 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.117' message 'Removed Observable Trait' id '3b3fbe7a-2ed5-46ee-b098-898d7b6c5434' date '' time '5:40:49 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-JAAyer.116' message '* Up until now, XML names were matched heuristically; the tokenizer would read characters until it encountered one of a few that it knew could not rightfully be part of an XML name. Now it properly matches the entire range for the first character of a name and for subsequent characters, as specified by the XML spec., using a bitmap-based character set.

* Replaced references to CharacterMap with Dictionary.' id '93250642-4ce7-448d-b856-8632989b4b75' date '' time '3:29:17 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.115' message 'empty log message' id '5665d1a2-24a4-49b9-ade7-3b5dcdc94bae' date '' time '2:50:47 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.115' message 'Added XMLPeekableStreamAdapter.' id 'fdeee206-d45f-4742-aea5-15218c10dd9d' date '' time '2:45:20 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.114' message 'Fixed a corner case in XMLNestedStreamReader>>atEnd and removed an unneeded message.' id '1ffe21c5-be32-472a-818d-bc6d7c899cf1' date '12/06/2010' time '11:47:21 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.113' message 'Removed the requirement that stream support #peek, #position, and #position: to be parsable, greatly expanded the documentation and integrated the newest version of OrderPreservingDictionary.' id '5fa50abf-ceb4-4d44-bcf5-dd6efa4750fa' date '12/06/2010' time '11:19:15 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.113' message 'Removed the requirement that streams support #peek, #position and #position: to be parsable and greatly expanded the documentation.' id '60c2e93e-e365-4759-a23e-ba3efd2b2d6f' date '12/06/2010' time '10:59:41 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.112' message 'empty log message' id 'b1253457-dd6b-460f-8555-bad1903f4bff' date '12/06/2010' time '1:10:30 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.111' message 'Fixed an entity handling bug and changed XMLOrderedList to work better with NewInspector.' id 'f7de4459-0251-4192-bc86-c63a94d2d769' date '' time '2:04:06 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.110' message '* The #firstTagNamedAny:, #tagsNamedAny:, #elementAtAny: and #elementsAtAny: forms have all been removed. Their usecase was a narrow one, and their functionality can be duplicated with the new enumeration API described below and the #isNamedAny: testing message that elements still respond to.

* All remaining #tagsNamed: messages have been deprecated for a new enumeration API. You can enumerate the child nodes and elements using collect:, detect:, detect:ifNone:, do:, and select: forms, and enumerate all descendent elements and nodes recursively with "all" forms, like #allElementsDo:.

* The remaining #firstTagNamed: messages have been deprecated for a new searching API that is namespace aware. The new messages are #findElementNamed:, #findElementNamed:with:, #findElementNamed:namespaceURI: and #findElementNamed:namespaceURI:with:.

* SAXDriver no longer inherits from XMLTokenizer.

* SAXHandler no longer retains a reference to SAXDriver.

* A facade class aptly named XMLParser provides the basic parsing interface using an injected driver and tokenizer created from it.

* Renamed methods in XMLNodeList and XMLAttributeList to parallel the methods that delegate to them in XMLNodeWithElements and XMLElement.

* Deprecated #@ (it should be in Pastell)

* Deprecated #printXMLOn: for #writeXMLWith:

* Added XMLDocument>>root: to complement XMLDocument>>root

* Renamed the markup declaration classes.

* Removed the #isAttribute test.

* Fixed a bug in XMLOrderedList.' id 'fe77cec6-e200-4987-9afd-91d8033418d1' date '' time '1:46:33 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.110' message '* The #firstTagNamedAny:, #tagsNamedAny:, #elementAtAny: and #elementsAtAny: forms have all been removed. Their usecase was a narrow one, and their functionality can be duplicated with the new enumeration API described below and the #isNamedAny: testing message that elements still respond to.

* All remaining #tagsNamed: messages have been deprecated for a new enumeration API. You can enumerate the child nodes and elements using collect:, detect:, detect:ifNone:, do:, and select: forms, and enumerate all descendent elements and nodes recursively with "all" forms, like #allElementsDo:.

* The remaining #firstTagNamed: messages have been deprecated for a new searching API that is namespace aware. The new messages are #findElementNamed:, #findElementNamed:with:, #findElementNamed:namespaceURI: and #findElementNamed:namespaceURI:with:.

* SAXDriver no longer inherits from XMLTokenizer.

* SAXHandler no longer retains a reference to SAXDriver.

* A facade class aptly named XMLParser provides the basic parsing interface using an injected driver and tokenizer created from it.

* Renamed methods in XMLNodeList and XMLAttributeList to parallel the methods that delegate to them in XMLNodeWithElements and XMLElement.

* Deprecated #@ (it should be in Pastell)

* Deprecated #printXMLOn: for #writeXMLWith:

* Added XMLDocument>>root: to complement XMLDocument>>root

* Renamed the markup declaration classes.

* Removed the #isAttribute test.

* Fixed a bug in XMLOrderedList.' id 'e366cfe4-04e4-40f3-bc45-425c69d62ffa' date '' time '1:32:51 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.109' message '* Added configuration classes to unclutter the parser and tokenizer classes and to allow for settings specified in a parser to be carried over to nodes and other objects.

* As a result the above addition, #innerXML: now works completely and is fully namespace aware.

* The namespace handling now preserves empty xmlns="" declarations intended to override default namespace declarations in a parent or ancestor.

* Renamed #recurse: and #recurseUntilTrue: to #traverseWith: and #searchWith:.

* Added #isDeclaredPrefix:, #isDeclaredPrefix:uri: and #undeclarePrefix: to XMLElement.

* XMLComment nodes can now be preserved using #preservesCommentNodes:.

* Deprecated #preservesCDataSections: and #preservesCDataSections in favor of #preservesCDataNodes: and #preservesCDataNodes.

* Refactored XMLObservableList and XMLNodeList to make them more understandable.' id '712ceb26-539b-4ea6-b9f5-935da29a3633' date '' time '2:34:29 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.108' message 'empty log message' id 'c86beea7-7099-4d20-8058-def0b6bb2150' date '' time '2:34:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.107' message 'Extracted Opax and its tests and renamed the XML-Parser-Exception classes slightly.' id '286e4822-4019-4b86-a6ce-1a624386e8b3' date '' time '7:11:27 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.106' message 'Updated to use the renamed and extracted OrderPreservingDictionary class.' id '2b8c7b40-d126-4bb2-9229-4c1eb2a61c6e' date '' time '8:17:03 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.105' message 'Extractec XMLWriter and tests into separate packages.' id 'be22b4ce-7588-4297-8745-61261cd5fd53' date '' time '3:23:11 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.104' message '* Fixed the element factory test to properly remove the dummy classes it creates when it runs.' id '94a7955e-6d44-4871-94ce-52c48f34dc3b' date '' time '7:26:11 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.103' message '* Added element handling based on class names in the element factory.

* Some minor fixes for potential porblems on other platforms.' id '144c1d14-2e16-48b8-89dc-ed588ee416f3' date '' time '6:53:36 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.102' message '* The DOM parser now supports the injection of node factories to control what concrete classes it uses for different node types. At the moment only certain node types are supported. See XMLNodeFactory.

* In addition to the default factory, there is a pluggable element factory that facilitates the mapping of elements to specific subclasses of XMLElement based on the name and namespace information of the elements. See XMLPluggableElementFactory for more information.

* Fixed the handling of "xml" and "xmlns" prefixes.

* Set about restructuring and improivng the test classes.

* Refactored the constructors in SAXHandler.

* Renamed #useNamespaces: to #usesNamespaces:.

* Fixed a bug in XMLNodeList.' id '5487bc05-66f4-42c0-bb95-e87fe68a0382' date '' time '1:04:10 am' author 'JAAyer' ancestors ((name 'XML-Parser-tg.101' message 'commented RootNode' id '3adcff01-412a-475f-99f2-fb4374db10bf' date '' time '8:05:05 pm' author 'tg' ancestors ((name 'XML-Parser-tg.100' message 'commented Opax classes' id '1efae2a4-9dbe-4e93-ac23-b4632fe233c1' date '' time '8:03:06 pm' author 'tg' ancestors ((name 'XML-Parser-JAAyer.99' message 'Unprefixed attributes no longer erroneously claim to belong to their element''s default namespace.' id '0a68f74a-b19c-4d80-922c-75e690b16cd4' date '' time '10:09:32 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.98' message '* #isEmpty and #notEmpty have been deprecated for #hasChildren. This is clearer, as there is no longer ambiguity as to whether certain childless nodes (attributes, strings) should be considered "empty."' id 'ca6baff2-7691-4ddc-aa65-a5e683766dbd' date '' time '7:36:43 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.97' message '* #qualifiedName is deprecated; #name suffices.

* Refactored XMLNodeTest and XMLNestedStreamReader

* CharacterMap is now bundled separately.' id '9b2bd823-569f-447a-a7bc-a8c9fd474f5f' date '' time '12:38:30 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.96' message 'XML-Parser-Writers

* XMLWriter has been replaced by a block-based API similar to Seaside''s HTML generation API. Browse the classes and their comments in XML-Parser-Writers for more information.

XML-Parser-Nodes:

* #contentString now returns the combined content of the receiver and its descendent elements with spaces added where appropriate. That means sending #contentString to an element with the structure of "<element>this is <child>text</child>content</element>" will yield "this is text content."

* Added #strings and #stringsDo: to avoid having to deal with string nodes directly.

* Added #elementAt:namespaceURI:, #elementAt:namespaceURI:ifAbsent:, #elementsAt:namespaceURI:, #attributeAt:namespaceURI:, and #attributeAt:namespaceURI:ifAbsent: to better facilitate element and attribute retrieval via namespace URI rather than prefix.

* XMLOrderedList no longer inherits from OrderedCollection.

* The node classes now use a custom observer API (for performance reasons). It is grafted on with Traits.

* Added additional node classes for markup declarations and comments (not used yet).

* Deprecated #isTag, #isText, and #isTagOrText in favor of #isElement, #isStringNode, and #isContentNode.

* Deprecated #elementsAndContents, #elementsAndContentsDo:, #contents, #contentsDo:, and #hasContents in favor of #contentNodes, #contentNodesDo:, #stringNodes, #stringNodesDo:, and #hasStringNodes.

* Deprecated #characterData, #tag.

* Deprecated #topNode and #topElement in favor of #firstNode and #firstElement.

* Deprecated the #at:, #at:ifAbsent:, #at:put:, and #at:ifAbsentPut: attribute accessor shortcuts in XMLElement. Most attribute manipulation involes only retrieval, and #@ already serves well enough as a shortcut for that purpose.

* Deprecated #tagsNamed:childrenDoAndRecurse: and #tagsNamed:contentsDo:

* Removed the already deprecated #valueFor:, #valueFor:ifAbsent:, #elementUnqualifiedAt: and #elementUnqualifiedAt:ifAbsent: messages.

XML-Parser

* Renamed XMLStreamReader to XMLNestedStreamReader, XMLStreamWriter to XMLNestedStreamWriter and XMLOpenTags to XMLWellFormednessChecker. The classes were also refactored.

* XMLOrderPreservingDictionary no longer inherits from Dictionary.

XML-Parser-Exceptions

* Renamed SAXNotWellFormedException to XMLWellFormednessException and replaced SAX- prefixes on other exception and warning classes with an XML prefix.' id 'bed3a022-5b8f-4e75-ad43-c8facd6b04f1' date '' time '7:15:08 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.95' message 'empty log message' id '80f686ac-cba6-4334-8151-c3d3f699ee9d' date '' time '5:34:41 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.94' message 'empty log message' id '1c39d314-eb5d-4d43-8c7d-fb5517a660cb' date '' time '5:32:40 am' author 'JAAyer' ancestors ((name 'XML-Parser-AlexandreBergel.93' message 'Fixed the faulty test. Thanks Henrik!' id 'eea1131f-bf90-4727-becc-5d123b840669' date '' time '10:13:58 am' author 'AlexandreBergel' ancestors ((name 'XML-Parser-JAAyer.92' message 'Includes DOM CDATA section preservation patch from Jan van de Sandt.' id 'e83345b4-700b-4873-a914-6cb95de46cfa' date '08/09/2010' time '5:52:51 pm' author 'JAAyer' ancestors ((name 'XML-Parser-jvds.91' message 'added the property preserveCDATASections to the XMLDOMParser' id '8a15ae9d-a332-6140-af5c-9d3b5d5a020c' date '08/09/2010' time '1:38:51 pm' author 'jvds' ancestors ((name 'XML-Parser-jvds.90' message '- added support for CDATASection nodes in the DOM
- updated the XMLDOMParser so CDATASections are preserved' id '500703d6-076f-c246-a91e-debf5db54c69' date '08/09/2010' time '11:28:58 am' author 'jvds' ancestors ((name 'XML-Parser-JAAyer.89' message 'Removed #utf8Example and #testNonUTF8Characters (which sends the former). #utf8Example contained non-UTF-8 characters and caused character encoding issues at the package and image level.' id 'e885be9a-f9f9-4f5b-a93f-2b297753bb1b' date '08/06/2010' time '2:11:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.88' message 'Removed #utf8Example and #testNonUTF8Characters (which sends the former). #utf8Example contained non-UTF-8 characters and caused character encoding issues at the package and image level.' id '1df0ff08-b87d-4c08-9870-8764c4f0d81b' date '08/06/2010' time '2:10:33 pm' author 'JAAyer' ancestors ((name 'XML-Parser-NorbertHartl.87' message '- removed withInternetLineEndings selector and replaced it with the replacement code. The selector does not exist in gemstone
- changed Dictionary to XMLOrderPreservingDictionary in tests as gemstone is checking class on equality testing
- added stream atEnd. Gemstone throws an error if next is called if the stream is atEnd. One should always use atEnd' id 'bd6b4f4c-9ff1-41f3-ac2e-471c0da20d95' date '08/05/2010' time '4:47:14 pm' author 'NorbertHartl' ancestors ((name 'XML-Parser-NorbertHartl.86' message 'removed another dot that is a syntax error in gemstone' id 'c4acceea-0b54-4551-bbd0-6d3f94ff566f' date '08/05/2010' time '12:29:37 pm' author 'NorbertHartl' ancestors ((name 'XML-Parser-NorbertHartl.85' message 'removed dots. These are syntax errors in gemstone' id 'c5857cb6-51c1-4e24-8cd9-6b812132614f' date '08/05/2010' time '11:11:55 am' author 'NorbertHartl' ancestors ((name 'XML-Parser-JAAyer.84' message 'Included this patch from Christophe Jalady to speed up Unicode parsing:

WriteStream>>stringContents
    | newSize |

    newSize := position.
--    ^(String new: newSize)
++    ^((collection class) new: newSize)
        replaceFrom: 1
        to: newSize
        with: collection
        startingAt: 1
' id '76abe1c1-ee00-443e-a9ca-5330fdf752bd' date '' time '1:14:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.83' message 'Included this patch from Christophe Jalady to speed up Unicode parsing:

WriteStream>>stringContents
    | newSize |

    newSize := position.
--    ^(String new: newSize)
++    ^((collection class) new: newSize)
        replaceFrom: 1
        to: newSize
        with: collection
        startingAt: 1' id 'ffa85307-1767-4f97-9e75-da760b5f944b' date '' time '1:13:21 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.82' message 'empty log message' id 'f2ff9c08-8a63-4956-bf74-dcaaf28b8d6e' date '' time '1:11 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.81' message 'remove stupid method' id '3888021f-ffdb-4174-90db-0a8cb8584b21' date '06/11/2010' time '3:21:44 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.80' message 'minor addition' id 'aa51b7de-ac71-4bd1-9b18-44ef9bccfadb' date '06/09/2010' time '7:01:01 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.79' message 'minor addition' id 'b91b2222-8813-4d58-8221-c9491733a924' date '06/09/2010' time '7:00:33 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.78' message 'Restructuring of Opax' id '56801ae8-3458-4109-84ef-203a73fbba5e' date '' time '2:09:54 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.77' message 'Opax is now integreated in XML-Parser. Opax is a small addition to SAXParser that enables dealing with tags polymorphically. ' id 'd4dff730-14ce-4fe4-ae01-278b8fa34700' date '' time '11:45:35 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.76' message 'Added a clarification on character (testDecodingCharacters).
Thanks to Damien Pollet for raising this question and Pharoer for helping understand what''s going on.' id 'e7d614f7-49d9-4cdc-aaa8-c647a2019e18' date '' time '11:23:25 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-DamienPollet.75' message 'Failing test for UTF-8 entities decoding.' id 'c42f2f2a-bdb1-4a07-a32b-b30f25c68ffa' date '' 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 '' 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 '' 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 '' 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 '' 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 '' 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 '' 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 '' 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 '' 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 '' time '1:52:21 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.65' message 'empty log message' id 'e9ea7108-9250-4e58-a40a-b008c2756a80' date '' time '8:25:47 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.64' message 'empty log message' id '6147738e-ddb4-400c-a2c1-5879895525a8' date '' time '11:33:56 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.63' message 'empty log message' id 'aa238952-5ee5-497d-9c14-4d0411cec373' date '' time '2:30:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.61' message 'empty log message' id '158add99-5c12-4112-844a-b1ae9d3f174f' date '' time '3:23:12 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.60' message 'empty log message' id 'd287422a-f317-42e4-a741-c110989157eb' date '' time '3:55:17 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.59' message 'empty log message' id 'd06f93cb-7fd0-4148-8c6b-48933406e23f' date '' time '4:44:16 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.58' message 'empty log message' id '0bd27681-93c7-4e45-8b2e-96818509c471' date '03/12/2010' time '10:35:50 am' author 'JAAyer' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-JAAyer.57' message '' id '99388deb-5dcd-4537-8d5c-aa95268a1709' date '03/12/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 '03/11/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 '03/11/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 '03/10/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 '03/10/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 '03/09/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 '03/09/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 '03/08/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 '03/07/2010' time '9:05:36 pm' author 'JAAyer' ancestors () stepChildren ())(name 'XML-Parser-Alexandre_Bergel.46' message 'Added an elementary benchmark' id 'ace3bc7f-9c6d-4bad-8a4b-aa748164ff41' date '03/04/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 '03/04/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 '03/04/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 '03/04/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 '03/04/2010' time '12:41:06 am' author 'JAAyer' ancestors () stepChildren ())(name 'XML-Parser-Alexandre_Bergel.41' message 'minor fix in a test method' id '6851179c-6087-47fe-b0f4-11d3bfb2da55' date '03/03/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 '03/03/2010' time '4:47:24 pm' author 'Alexandre Bergel' 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 '03/02/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 '' 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 '' 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 '' 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 '' 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 '' time '11:25:55 am' author 'Alexandre Bergel' ancestors () stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-JAAyer.36' message 'empty log message' id '5b5789a3-2ea6-4caa-a401-2b952ce9c6a3' date '' time '11:24:16 pm' author 'JAAyer' ancestors ((name 'XML-Parser-NoBlankLineAfterSignature.34' message 'empty log message' id 'db37873f-8ea5-4139-9bbe-b2d6f8d7c0b1' date '' time '2:40:31 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.33' message 'empty log message' id 'edaca8c0-6fb4-474e-869b-d6022906820c' date '' time '6:03:46 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.32' message 'empty log message' id '3035573d-5817-4c24-8ab3-a10aa9b58b31' date '' time '10:31:29 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.31' message 'empty log message' id 'f3814ba1-1c5e-43df-9528-bfd546326b94' date '' time '9:29:38 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.30' message 'empty log message' id 'd8e3427f-ebae-4192-a45a-29ee22e3d3ae' date '' time '10:09:37 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.29' message 'empty log message' id '5dd97371-5d93-4ee3-82b6-5fd9a653e553' date '' time '9:55:46 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.28' message 'Recategorization' id '9ef076c5-f3c4-4809-a178-ba43e599be84' date '' 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 '' 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 '' 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 '' time '12:47:59 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.24' message 'empty log message' id 'bad20136-a096-4b1a-ac22-b5c50a3b4027' date '' time '12:41:18 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.23' message 'empty log message' id 'dc20f9d2-55ce-477b-b970-8fa29921e224' date '' time '11:30:50 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.22' message 'empty log message' id '708b3609-6172-451a-adf7-ed12896cd6b3' date '' time '8:49:57 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.21' message 'empty log message' id '5200e3fd-4d92-4e7b-97b6-bebb3346a9ff' date '' 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 '' 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 '' time '10:15:16 pm' author 'Alexandre Bergel' ancestors () stepChildren ())) stepChildren ())(name 'XML-Parser-JAAyer.2' message 'empty log message' id '3d72c1fc-082d-49b8-ab01-0dd17aae834a' date '' time '8:24:39 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.1' message 'empty log message' id '2c6605c5-4d63-43e9-b08e-c19b079fce7c' date '' 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 '01/10/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 '01/09/2010' time '11:56:50 pm' author 'GeorgeHerolyants' ancestors ((name 'XML-Parser-Alexandre_Bergel.19' message 'Minor change in XMLElement>>contentString.
' id 'a8fe6c4d-fa69-4921-8ef5-f939749ee78b' date '' 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 '' 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 '06/01/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 '06/01/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 '' time '2:39:56 pm' author 'AlexandreBergel' ancestors ((name 'XML-Parser-mir.14' message 'fixed contentsDo:' id '6539d61e-ed4a-9244-8b85-c4e5417bbeb1' date '01/03/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 '' 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 '' 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 '' 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 '' 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 '' 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 '' 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 '' 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 '02/03/2006' time '2:38:29 pm' author 'thf' ancestors ((name 'XML-Parser-thf.5' message '' id '817bbe38-4e92-4d6a-a8e1-daf812ed7567' date '09/07/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 '09/01/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 '' time '12:17:02 pm' author 'thf' ancestors () 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 '' time '4:17:02 pm' author 'mir' ancestors ((name 'XML-Parser-mir.2' message 'Yaxo 2.1 release' id 'fcd07bb1-1c15-2f48-92a3-b0aedaaf24a9' date '' 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 '' time '10:32:36 am' author 'mir' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())