A bit OT, but have a look at E4X. It's only supported in mozilla, but
you might be able to write an emulation for IE
On 3/17/06, Gregory Hill <[EMAIL PROTECTED]> wrote:
>
>
>
> It's pretty quick-and-dirty, but this is my first attempt.
>
>
>
> function xmlToHash(el) {
>
> Element.cleanWhitespace(el);
>
> if (el.hasAttributes() || (el.hasChildNodes() && el.childNodes[0].nodeType
> == 1)) {
>
> var localHash = {};
>
> if (el.hasAttributes && el.attributes.length >= 1) {
>
> $A(el.attributes).each(function (attr) { localHash[attr.nodeName] =
> attr.nodeValue; });
>
> }
>
> $A(el.childNodes).each(function (el) { xmlToHashElement(localHash, el);
> });
>
> for (attr in localHash) {
>
> if (localHash[attr].length == 1) {
>
> localHash[attr] = localHash[attr][0];
>
> }
>
> }
>
> return localHash;
>
> }
>
> else {
>
> return el.textContent || '';
>
> }
>
> }
>
>
>
> function xmlToHashElement (hash, el) {
>
> if (el.nodeType == 2) {
>
> hash[el.localName] = [ el.textContent ];
>
> }
>
> else {
>
> var key = el.tagName;
>
> if (hash[key]) {
>
> hash[key].push(xmlToHash(el));
>
> }
>
> else {
>
> hash[key] = [ xmlToHash(el) ];
>
> }
>
> }
>
> }
>
>
>
> You just do:
>
>
>
> var hash = xmlToHash(response.responseXML.documentElement);
>
>
>
> The tag name of the child nodes become the keys in the hash, and if there
> are more than one with the same tag name, it is an array as the value. It
> handles attributes as well, with the attribute name becoming the hash key
> and the value the value. I imagine if you had a child node with a tag name
> that matched the attribute, it would overwrite the attribute. I didn't
> think that was worth handling, as I couldn't think of a legitimate scenario
> where it would be desirable.
>
>
>
> And it's recursive, so you can put nodes within nodes and it will create
> hashes out of them. I imagine it doesn't handle every possible scenario,
> but it's a decent start. You need to load prototype to use this, btw.
>
>
>
> Greg
>
>
>
>
>
>
>
> ________________________________
>
>
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On
> Behalf Of Tom Riley
> Sent: Friday, March 17, 2006 9:56 AM
>
> To: [email protected]
> Subject: Re: [Rails-spinoffs] good javascript xml parser
>
>
> To: [email protected]
> Subject: Re: [Rails-spinoffs] good javascript xml parser
>
>
>
>
>
>
> This might not be practical for you, but the google maps api has an xml
> parser that uses a native xml parser if the browser has one and a javascript
> parser if the browser doesn't.
>
>
>
>
>
> http://www.google.com/apis/maps/documentation/#GXml_code_
>
>
>
>
>
> Also, just found http://xmljs.sourceforge.net/
>
>
>
>
> Tom Riley
>
>
>
>
>
> <http://www.smallroomsoftware.com>
>
>
>
>
>
>
>
>
> On 17 Mar 2006, at 16:46, Gregory Hill wrote:
>
>
>
>
>
> Hmm… that is a pretty cool class. I was hoping more for something that you
> didn't need to know what the tag names were, it would just create a
> hierarchy that you could drill down into easily, but if I get stuck, this is
> a good backup.
>
>
>
> Greg
>
>
>
> ________________________________
>
>
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On
> Behalf Of Maninder, Singh
> Sent: Friday, March 17, 2006 9:34 AM
> To: [email protected]
> Subject: RE: [Rails-spinoffs] good javascript xml parser
>
>
>
>
> Maybe this would help you :)
>
>
>
>
>
> Thank you,
> Mandy.
>
>
>
>
>
> p.s. I have not written this. I got this from some site long time back.
>
>
>
>
>
>
>
>
> XMLParser = Class.create();
> Object.extend(XMLParser.prototype, {
> initialize: function(xmlObj) {
> this.xmlObj = xmlObj;
> this.root = xmlObj.documentElement;
> },
> list: function(value) {
> var result = this.root.getElementsByTagName(value);
> return result;
> },
> get: function (node, value) {
> if(typeof value != 'undefined')
> node = node.getElementsByTagName(value).item(0);
> return this.text(node);
> },
> toArray: function(value) {
> var list = this.list(value);
> var nodeValues = new Array();
> for (var i = 0; i < list.length; i++) {
> nodeValues.push(this.get(list[i]));
> }
> return nodeValues;
> },
> text: function (node) {
> if (typeof node.textContent != 'undefined') {
> return node.textContent;
> }
> else if (typeof node.innerText != 'undefined') {
> return node.innerText;
> }
> else if (typeof node.text != 'undefined') {
> return node.text;
> }
> else {
> switch (node.nodeType) {
> case 3:
> case 4:
> return node.nodeValue;
> break;
> case 1:
> case 11:
> var innerText = '';
> for (var i = 0; i < node.childNodes.length; i++)
> {
> innerText += text(node.childNodes[i]);
> }
> return innerText;
> break;
> default:
> return '';
> }
> }
> }
> });
> XMLParser.nodeType = [
> "",
> "ELEMENT_NODE", // 1
> "ATTRIBUTE_NODE", // 2
> "TEXT_NODE", // 3
> "CDATA_SECTION_NODE", // 4
> "ENTITY_REFERENCE_NODE", // 5
> "ENTITY_NODE", // 6
> "PROCESSING_INSTRUCTION_NODE", // 7
> "COMMENT_NODE", // 8
> "DOCUMENT_NODE", // 9
> "DOCUMENT_TYPE_NODE", // 10
> "DOCUMENT_FRAGMENT_NODE", // 11
> "NOTATION_NODE" // 12
> ];
>
>
>
>
>
> <*cript language="javascript" type="text/javascript">
> var xmlParser = new XMLParser(originalRequest.responseXML);
> var items = xmlParser.list('item');
> for (var i = 0; i < items.length; i++) {
> var id = xmlParser.get(items[i], 'id');
> var name = xmlParser.get(items[i], 'name');
>
> $('result').value += id + ', ' + name + '\r\n';
> }
> var names = xmlParser.list('name');
> for (var i = 0; i < names.length; i++) {
> $('result').value += xmlParser.get(names[i]) + '\r\n';
> }
> var ids = xmlParser.toArray('id');
> for (var i = 0; i < ids.length; i++) {
> $('result').value += 'id:' + ids[i] + '\r\n';
> }
> </*cript>
> <textarea id="result" cols="60" rows="10" ></textarea>
>
>
>
>
>
> <?xml version="1.0" encoding='euc-kr'?>
> <list>
> <item>
> <id>1</id>
> <name>a1</name>
> </item>
> <item>
> <id>2</id>
> <name>a2</name>
> </item>
> <item>
> <id>3</id>
> <name>a3</name>
> </item>
> </list>
>
>
> _______________________________________________
>
>
> Rails-spinoffs mailing list
>
>
> [email protected]
>
>
> http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs
>
>
>
> _______________________________________________
> Rails-spinoffs mailing list
> [email protected]
> http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs
>
>
>
--
troels
_______________________________________________
Rails-spinoffs mailing list
[email protected]
http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs