From: "McLaughlin, James T." Date: 2007-11-27T03:22:28+09:00 Subject: Re: How to map XML attributes ------=_NextPart_000_0087_01C8302F.54E5C680 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit (Sorry about top posting - Outlook...) Personally I prefer handling the different pieces of the XML in a consistent manner. That is, if you have the XML you provided, plus a little: HTML Content RSS Content And I wanted to process everything under , since that tag contains the data that I am interested in, I'd want to be able to pass around the ... elements. Therefore, attributes would need to be associated with the tag where they appear, not for the entire DOM. So lets say that I (hypothetically) want to write a recursive XML parser that reads data from XML and uses an activerecord object to insert it into a database (This is a fairly common use case, at least for me). The pseudoRUBYcode for this would be: def parse(xml) if !xml.nil? parse (xml.child_nodes) # parse all XML elements that are my children xml.save # Save the XML to the DB end end Since I need to access the type attribute in the xml.save method (so I can handle HTML and RSS differently, for example), then I will need to pass it along with the XML elements that make up the child nodes. I like to think of each XML node as a crude Object, thus all data contained within that Object should remain with that Object. Make sense? Jamie -----Original Message----- From: ruby-talk-admin@ruby-lang.org [mailto:ruby-talk-admin@ruby-lang.org] On Behalf Of Trans Sent: Monday, November 26, 2007 11:38 AM To: ruby-talk ML Subject: How to map XML attributes I'm working on a DSL that maps XML <=> Object, and I'm stuck on where to store tag attributes. Do attributes belong to the tag or to the content? For example: HTML Content In mapping this to an object, lets say: foo.bar #=> "HTML Content" Does is make sense to ask: foo.bar.attributes #=> { 'xmlns'=>..., 'type'=>... } or should the attributes be tied to the "attributation" of foo, so: foo.attributes(:bar) #=> { 'xmlns'=>..., 'type'=>... } The 'type' attribute makes me think the first makes the most sense, but the 'xmlns' makes me think the later. Any insights? Thanks, T. ------=_NextPart_000_0087_01C8302F.54E5C680 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIYKjCCAlow ggHDAgIBpTANBgkqhkiG9w0BAQQFADB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBv cmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MB4XDTk4MDgxMzAwMjkwMFoXDTE4MDgxMzIzNTkw MFowdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RF IEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuMSMwIQYDVQQDExpHVEUgQ3liZXJUcnVzdCBHbG9i YWwgUm9vdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAlQ+gtvBQnOh6x4jN3RcOLrCU0Bs9 DvaUwIqUxwbIkJfIuGQaen5sPFPhNyhzYH+yl1MHn1P5bViU0q+NbYhngObtspXPcjHKpRxyulwC 52RC5/mpLNY6DayNQqokATnmnD8BhVcNWIdF+NOFqpNpJoVwSIA/EhXHebQfBS87YpkCAwEAATAN BgkqhkiG9w0BAQQFAAOBgQBt6xsJ6V7ZUdtnImGkKjxId+OgfKbec6IUA4U9+6sOMMWDFjOBEwie ezRO30DIdNe5fdz0dlV9m2NUGOnw6vNcsdmLQh65wJVOuvrV4nz1aGG/juwFl19bsNejhTTEJKcN D5WT78uU2J4fnVyFbceqrk8fIrXNla26p8z5qwt6fzCCBGEwggPKoAMCAQICBAQAA84wDQYJKoZI hvcNAQEFBQAwdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEnMCUGA1UE CxMeR1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuMSMwIQYDVQQDExpHVEUgQ3liZXJUcnVz dCBHbG9iYWwgUm9vdDAeFw0wNTAyMTYxOTE5MDBaFw0xNTAyMTYyMzU5MDBaME0xCzAJBgNVBAYT AlVTMQ0wCwYDVQQKEwRTQUlDMQwwCgYDVQQLEwNQS0kxITAfBgNVBAMTGFNBSUMgUHVibGljIFBv bGljeSBDQSAwMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANThOSpvM6bD1CYeSIKG +06hBrAs34cNeXEF7wkLKFmYh4q8qPnXpBfszDOSESMr5ga3qMUca9bKzL24fYa/M0KVdYSw7vku wAJbXnJfO+fojw3/fDDEy6ODSoT9xIyIJc/srMlFOpSnk8+3kj8DmTeIXjHc6vKad1OMUNjgSDyf gA40rAvkBiBEAlVCgWLpaPfsa4pEIXBKU2O4V/MTrZ9eN+Zh4nMInr5hx+/1S7x3/0GhamcSx3lG NlnproMMvtdh3NH59ILFxs3WGC0kDOHqoE6Z40LATfJa1+0WdyziqO+Ux+cZsC3c207ylogJ5Lhs nykM+NcM34raA1D5fdcCAwEAAaOCAaAwggGcMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cu cHVibGljLXRydXN0LmNvbS9jZ2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYDVR0OBBYEFPnR1qtg 0JFa0ijYRpon/KopT/ncMIGDBgNVHSAEfDB6MEgGCSsGAQQBsT4BADA7MDkGCCsGAQUFBwIBFi1o dHRwOi8vd3d3LnB1YmxpYy10cnVzdC5jb20vQ1BTL09tbmlSb290Lmh0bWwwDgYMKwYBBAGNLYMQ AQEBMA4GDCsGAQQBjS2DEAEBAjAOBgwrBgEEAY0tgxABAQMwgYkGA1UdIwSBgTB/oXmkdzB1MQsw CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290 ggIBpTAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBATANBgkqhkiG9w0BAQUFAAOB gQALKaUaBn1yGYUUKO62ACW8oxBxYVw/FXDr5y5W3k6RvOzaYZcYTqY4FaM+rxsWb5qsGOhmfHKn v1Ktly4h9PW3r5BtXCFYeUq8ZYBDnu7cg7CkIOn9BCweMa6Cs/Cua0xEUN4n4i4Ccu1NGZlRQJJp qT781jhUgfrUHf5HRo+z5DCCBbQwggScoAMCAQICChPfY5cAAAAAQk0wDQYJKoZIhvcNAQEFBQAw TjELMAkGA1UEBhMCVVMxDTALBgNVBAoTBFNBSUMxDDAKBgNVBAsTA1BLSTEiMCAGA1UEAxMZU0FJ QyBQdWJsaWMgSXNzdWluZyBDQSAwMTAeFw0wNjEyMDQyMTAzMjVaFw0wODEyMDMyMTAzMjVaMGcx CzAJBgNVBAYTAlVTMQ0wCwYDVQQKEwRTQUlDMR0wGwYDVQQDExRNY0xhdWdobGluLCBKYW1lcyBU LjEqMCgGCSqGSIb3DQEJARYbSkFNRVMuVC5NQ0xBVUdITElOQHNhaWMuY29tMIGfMA0GCSqGSIb3 DQEBAQUAA4GNADCBiQKBgQDDhHzC4jq+Z63/1wrS5Gl1TsJDf3/soaxnM8hl1T9P8NCwp34tp93s OihkFsz7uY6L3SBz+X0sbVHBlcOKeEHVCzpLjMHkbUSqG8h3i/ra0B6De+wuN09ONhtbIoeUL7pj pTzQ24JIThnL+NxzK3vNMpEpBVYq5FGmK592g0vpQQIDAQABo4IC/TCCAvkwDgYDVR0PAQH/BAQD AgbAMB0GA1UdDgQWBBQyf4JMFS6MLIeVmM2J6tMr178coDAfBgNVHSMEGDAWgBR8skibsdrJPfMv x3Pi8ku4XuRGwDCBxgYDVR0fBIG+MIG7MIG4oIG1oIGyhj1odHRwOi8vY3JsLnBraS5zYWljLmNv bS9TQUlDJTIwUHVibGljJTIwSXNzdWluZyUyMENBJTIwMDEuY3JshnFsZGFwOi8vbGRhcC5wa2ku c2FpYy5jb20vQ049U0FJQyUyMFB1YmxpYyUyMElzc3VpbmclMjBDQSUyMDAxLE9VPUNEUCxPVT1Q S0ksTz1TQUlDLEM9VVM/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDCBzgYIKwYBBQUHAQEEgcEw gb4wSQYIKwYBBQUHMAKGPWh0dHA6Ly9haWEucGtpLnNhaWMuY29tL1NBSUMlMjBQdWJsaWMlMjBJ c3N1aW5nJTIwQ0ElMjAwMS5jcnQwcQYIKwYBBQUHMAKGZWxkYXA6Ly9sZGFwLnBraS5zYWljLmNv bS9DTj1TQUlDJTIwUHVibGljJTIwSXNzdWluZyUyMENBJTIwMDEsT1U9QUlBLE9VPVBLSSxPPVNB SUMsQz1VUz9jQUNlcnRpZmljYXRlMAwGA1UdEwEB/wQCMAAwPAYJKwYBBAGCNxUHBC8wLQYlKwYB BAGCNxUIgsTzfPXXGIL5kRuEgcVeg/7YVEyHst1PhsP5CAIBZAIBAjAfBgNVHSUEGDAWBggrBgEF BQcDBAYKKwYBBAGCNwoDDDBNBgNVHSAERjBEMEIGDCsGAQQBjS2DEAEBAjAyMDAGCCsGAQUFBwIB FiRIVFRQOi8vcG9saWNpZXMucGtpLnNhaWMuY29tL2NwMS5odG0wKQYJKwYBBAGCNxUKBBwwGjAK BggrBgEFBQcDBDAMBgorBgEEAYI3CgMMMCYGA1UdEQQfMB2BG0pBTUVTLlQuTUNMQVVHSExJTkBz YWljLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAZMv2tdJkd+YU901TcAvdCMPb0+logyvLOxSw967Q YRqg5VLahfa5+jutCM5dbDlyvCIO8O/3PsHz+eLp2u5ckIFr5FlSoiJuMeXykWL/jG1UPrlWTt+P u0TVczbtY7uzY/N6qQpMBG0KTo5JPYcKfNR54t+ifF1ibzT5p0qn+66VpI749wdmjzjiSfsoMQ7i i6aU2CFa4xCILv7hg3W2z7SxsLDi1z50u60dK/O1PuNrJ64l0+vuVUttiH6V8+MC18Zb/FpZ/OhF 1I4aWnm/+s8yC5SXbErf48N2p+DAgwH4xn5GkWNpUZ6D2GkeqN+Up5PcjreieoojH0UCQB26LTCC BccwggSvoAMCAQICCgTTgdMAAAAAAAMwDQYJKoZIhvcNAQEFBQAwTTELMAkGA1UEBhMCVVMxDTAL BgNVBAoTBFNBSUMxDDAKBgNVBAsTA1BLSTEhMB8GA1UEAxMYU0FJQyBQdWJsaWMgUG9saWN5IENB IDAxMB4XDTA1MDIyMjIxNDc0OFoXDTExMDIyMjIxNTc0OFowTjELMAkGA1UEBhMCVVMxDTALBgNV BAoTBFNBSUMxDDAKBgNVBAsTA1BLSTEiMCAGA1UEAxMZU0FJQyBQdWJsaWMgSXNzdWluZyBDQSAw MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANTyJK86tUxEu1GdvO+z6Vs4XM4SaNhZ p/sXrIcdXC6p54V3FAQCPSuiMLPHU/d61rOxYnbTwQ/SVHh4ftdkMMNyK72QGXdfQy9RY1tW0zpE QypeFj1QVfrgWo+RYrGlshs2oZtOCmKup79Oa5lXpWXoyGEUwVwvt0cpWQsWN+Kiza1kzKgf2lXN vDftWFqD6LvFPo0tVt4Kymykd0ETVxqok/nZIFzoyP/vXasX9eIp+OQlJXZtfLs/A+yZbxC/DJmP w4mkPu4InWvlV5VwQJDnWWN079DJWEsV/Jw6N5T8Kb3ATouuIATf0Lkx/k6ScD22yBvR3z4UkgTS S96xynsCAwEAAaOCAqYwggKiMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHyySJux2sk9 8y/Hc+LyS7he5EbAMAsGA1UdDwQEAwIBxjAQBgkrBgEEAYI3FQEEAwIBADB8BgNVHSAEdTBzMEEG CysGAQQBjS2DEAEBMDIwMAYIKwYBBQUHAgEWJGh0dHA6Ly9wb2xpY2llcy5wa2kuc2FpYy5jb20v Y3AxLmh0bTAOBgwrBgEEAY0tgxABAQEwDgYMKwYBBAGNLYMQAQECMA4GDCsGAQQBjS2DEAEBAzAZ BgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBT50darYNCRWtIo2EaaJ/yqKU/5 3DCBxAYDVR0fBIG8MIG5MIG2oIGzoIGwhjxodHRwOi8vY3JsLnBraS5zYWljLmNvbS9TQUlDJTIw UHVibGljJTIwUG9saWN5JTIwQ0ElMjAwMS5jcmyGcGxkYXA6Ly9sZGFwLnBraS5zYWljLmNvbS9D Tj1TQUlDJTIwUHVibGljJTIwUG9saWN5JTIwQ0ElMjAwMSxPVT1DRFAsT1U9UEtJLE89U0FJQyxD PVVTP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QwgcwGCCsGAQUFBwEBBIG/MIG8MEgGCCsGAQUF BzAChjxodHRwOi8vYWlhLnBraS5zYWljLmNvbS9TQUlDJTIwUHVibGljJTIwUG9saWN5JTIwQ0El MjAwMS5jcnQwcAYIKwYBBQUHMAKGZGxkYXA6Ly9sZGFwLnBraS5zYWljLmNvbS9DTj1TQUlDJTIw UHVibGljJTIwUG9saWN5JTIwQ0ElMjAwMSxPVT1BSUEsT1U9UEtJLE89U0FJQyxDPVVTP2NBQ2Vy dGlmaWNhdGUwDQYJKoZIhvcNAQEFBQADggEBALsyJ+4T39GnWF28couOt37YHvNvsFOt5RKXsynS zHp7OyPkY6s90OSvTebH6D5RBkA5kFBEFNgoYb7JTeS+S613EuWPFHcYwStTynj43PMLVk2IrGGI iJYkhgldMfkr6PLlCFqVYSC5hN0hhPYX2Z+9qFVea0sAd6QNSdK6hfS3tImCBuXGO5kMDXFEMX1S FclYlC2I/1O25JkUawRSTx4BYW6AasJpaIE7/tuh4T0wpmPBqKnGRf3JvLR0mxTUHwkQaUkkPUVc dt6VyixxXVNJtGm60OAQIimFEoY4W0lQZOW1jDZPyt93OevysLRHYcDzc3QeDmiiP9qMHtonCnQw ggXgMIIEyKADAgECAgoT31SzAAAAAEJMMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVTMQ0w CwYDVQQKEwRTQUlDMQwwCgYDVQQLEwNQS0kxIjAgBgNVBAMTGVNBSUMgUHVibGljIElzc3Vpbmcg Q0EgMDEwHhcNMDYxMjA0MjEwMzE1WhcNMDgxMjAzMjEwMzE1WjBnMQswCQYDVQQGEwJVUzENMAsG A1UEChMEU0FJQzEdMBsGA1UEAxMUTWNMYXVnaGxpbiwgSmFtZXMgVC4xKjAoBgkqhkiG9w0BCQEW G0pBTUVTLlQuTUNMQVVHSExJTkBzYWljLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA 3O3hSXv4fV62Pb0WpUjPGWOHdNRSqr0XmCt3QAw4OJ01LG0yHfL1o2eqHEMn6C1+ITgqrl5aXaU0 KYe2l0PLfNaXZ73mT4qT0GLuZTsOdq9erTpKceAacemhByWcijOXV9rI/VF4jNmHNz5yf48ef27/ uS02duJHt4UctyhuSaUCAwEAAaOCAykwggMlMA4GA1UdDwEB/wQEAwIEMDAdBgNVHQ4EFgQU/ETF kPqoytq0Kg/BZ9LW1tTqntEwHwYDVR0jBBgwFoAUfLJIm7HayT3zL8dz4vJLuF7kRsAwgcYGA1Ud HwSBvjCBuzCBuKCBtaCBsoY9aHR0cDovL2NybC5wa2kuc2FpYy5jb20vU0FJQyUyMFB1YmxpYyUy MElzc3VpbmclMjBDQSUyMDAxLmNybIZxbGRhcDovL2xkYXAucGtpLnNhaWMuY29tL0NOPVNBSUMl MjBQdWJsaWMlMjBJc3N1aW5nJTIwQ0ElMjAwMSxPVT1DRFAsT1U9UEtJLE89U0FJQyxDPVVTP2Nl cnRpZmljYXRlUmV2b2NhdGlvbkxpc3Qwgc4GCCsGAQUFBwEBBIHBMIG+MEkGCCsGAQUFBzAChj1o dHRwOi8vYWlhLnBraS5zYWljLmNvbS9TQUlDJTIwUHVibGljJTIwSXNzdWluZyUyMENBJTIwMDEu Y3J0MHEGCCsGAQUFBzAChmVsZGFwOi8vbGRhcC5wa2kuc2FpYy5jb20vQ049U0FJQyUyMFB1Ymxp YyUyMElzc3VpbmclMjBDQSUyMDAxLE9VPUFJQSxPVT1QS0ksTz1TQUlDLEM9VVM/Y0FDZXJ0aWZp Y2F0ZTAMBgNVHRMBAf8EAjAAMDwGCSsGAQQBgjcVBwQvMC0GJSsGAQQBgjcVCILE83z11xiC+ZEb hIHFXoP+2FRMhpL2D4X3kD8CAWQCAQQwEwYDVR0lBAwwCgYIKwYBBQUHAwQwTQYDVR0gBEYwRDBC BgwrBgEEAY0tgxABAQIwMjAwBggrBgEFBQcCARYkSFRUUDovL3BvbGljaWVzLnBraS5zYWljLmNv bS9jcDEuaHRtMBsGCSsGAQQBgjcVCgQOMAwwCgYIKwYBBQUHAwQwJgYDVR0RBB8wHYEbSkFNRVMu VC5NQ0xBVUdITElOQHNhaWMuY29tMEQGCSqGSIb3DQEJDwQ3MDUwDgYIKoZIhvcNAwICAgCAMA4G CCqGSIb3DQMEAgIAgDAHBgUrDgMCBzAKBggqhkiG9w0DBzANBgkqhkiG9w0BAQUFAAOCAQEARt1r BHdKHSf+//m4TUr5AZ7dT50IQWjPTkK+oEW907Y+Xd/jBshWdp3ggBXFPWZO4LAwJxR97K1HBebr uInlANX8hffXOlU8ED8ZgPYAOJv19wO5VlT0qqevj4+rIF7K/ZJ0bJpIYHDrCEJx23mtmC7tf4dY SxvEZsbhwbFIi/REip9OyOanaS/WwvRIzJCYmE1vjaoWGlv+OCfT39cXoWr57IxnDKiYfN1eliUB X7CRRYGMCl4yekjDse4sR3o63IOsTvZGl9oSI5XUXdb24a7y74HFarZdmEfbY9yoKKF8KmT5K+Pr 7IU0jarIufllldaaRn6voHDBZr8JCRUxDzGCAqgwggKkAgEBMFwwTjELMAkGA1UEBhMCVVMxDTAL BgNVBAoTBFNBSUMxDDAKBgNVBAsTA1BLSTEiMCAGA1UEAxMZU0FJQyBQdWJsaWMgSXNzdWluZyBD QSAwMQIKE99jlwAAAABCTTAJBgUrDgMCGgUAoIIBojAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB MBwGCSqGSIb3DQEJBTEPFw0wNzExMjYxODIyMDJaMCMGCSqGSIb3DQEJBDEWBBSpbPjCCKLFWDfO 8Pwpq1Fmpu4yBTBnBgkqhkiG9w0BCQ8xWjBYMAoGCCqGSIb3DQMHMA4GCCqGSIb3DQMCAgIAgDAN BggqhkiG9w0DAgIBQDAHBgUrDgMCBzANBggqhkiG9w0DAgIBKDAHBgUrDgMCGjAKBggqhkiG9w0C BTBrBgkrBgEEAYI3EAQxXjBcME4xCzAJBgNVBAYTAlVTMQ0wCwYDVQQKEwRTQUlDMQwwCgYDVQQL EwNQS0kxIjAgBgNVBAMTGVNBSUMgUHVibGljIElzc3VpbmcgQ0EgMDECChPfVLMAAAAAQkwwbQYL KoZIhvcNAQkQAgsxXqBcME4xCzAJBgNVBAYTAlVTMQ0wCwYDVQQKEwRTQUlDMQwwCgYDVQQLEwNQ S0kxIjAgBgNVBAMTGVNBSUMgUHVibGljIElzc3VpbmcgQ0EgMDECChPfVLMAAAAAQkwwDQYJKoZI hvcNAQEBBQAEgYCMZlPAKXmXtb6SzShX0ebJWT8fTU2nDEAm7qL8txNGa4oH8yKMD2PbtsjJhjuY i/z1qV5RnL47kR+0TKzc3ZVvl/IHYUgz7PO6UZYpiU88PraGoCE5YwBf+4DWipBpFwTMTEWjoZ2r z1Sm2UChPNMCVpw+APBWsp6t1YuNkz24/AAAAAAAAA== ------=_NextPart_000_0087_01C8302F.54E5C680--