[jQuery] probleem XML parsen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig een SOAP bericht in jQuery te parsen. jQuery kan hiervoor dezelfde tools gebruiken om door HTML te navigeren, dus dat is lekker makkelijk. Helaas werkt het niet hier. Ik heb de volgende code:

JavaScript:
1
2
3
4
5
6
7
8
9
var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><GetPageDataResponse xmlns=\"http://ns\"><GetPageDataResult><text>test tekst</text><text2 /><text3 /><url /><isUpdated>false</isUpdated><isTwoCollums>false</isTwoCollums><isHome>false</isHome></GetPageDataResult></GetPageDataResponse></soap:Body></soap:Envelope>";

// Geeft een lege tekst terug
alert($(xml).find("text").text());

var xml2 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><messages><msg>moi</msg><msg>hoi!</msg></messages>";
    
// Geeft 0 terug
alert($(xml2).find("msg").length);


Ik krijg het echter maar niet voor elkaar om de inhoud van een bepaalde XML node uit te lezen. Zelfs in het 2e voorbeeld krijg ik een length van 0 terug. Iemand enig idee of ik wat fout doe?
(Helaas heeft jQuery geen eigen boards maar enkel een mailinglist, anders had ik het daar wel gevraagd)

Edit: Het gaat dus om IE6 waarin het niet werkt :(

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

Jouw voorbeeld geeft bij mij gewoon "test tekst" en "2".

jQuery 1.3.2 en natuurlijk in documentready. Veel meer dan dat is er niet te doen :)

[ Voor 44% gewijzigd door Bosmonster op 08-01-2010 10:15 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:31

MueR

Admin Tweakers Discord

is niet lief

Ik vermoed dat je toch wat beter moet debuggen. Ik kopieer je code net namelijk letterlijk en hij werkt gewoon. Waarschijnlijk zit er iets anders te vervelen in je code.

edit: laat

[ Voor 3% gewijzigd door MueR op 08-01-2010 10:15 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:25

crisp

Devver

Pixelated

Uhm, een string is natuurlijk geen XML document object, en ik denk niet dat jQuery dat automatisch voor je doet.

En als het wel al een XML document is (bijvoorbeeld de resonseXML vanuit een Ajax call) dan kan je ook gewoon met behulp van getElementsByTagName er doorheen lopen :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14-09 17:03

Creepy

Tactical Espionage Splatterer

code:
1
$(xml)

Bovenstaande zorgt ervoor dat jQuery de xml als string parsed zodat je vervolgens jQuery functionaliteit (zoals find() ) gewoon kan gebruiken. Het is dan nog steeds geen Document object o.i.d. maar een jQuery object.

[ Voor 18% gewijzigd door Creepy op 08-01-2010 10:21 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:25

crisp

Devver

Pixelated

Creepy schreef op vrijdag 08 januari 2010 @ 10:19:
code:
1
$(xml)

Bovenstaande zorgt ervoor dat jQuery de xml als string parsed zodat je vervolgens jQuery functionaliteit (zoals find() ) gewoon kan gebruiken.
Really? Das nogal goochelarij dan; ik weet niet of ik daar echt vrolijk van zou worden als ik niet expliciet heb aangegeven wat het eigenlijk precies zou moeten zijn - mimetypes zijn er doorgaans niet voor niets...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

crisp schreef op vrijdag 08 januari 2010 @ 10:22:
[...]

Really? Das nogal goochelarij dan; ik weet niet of ik daar echt vrolijk van zou worden als ik niet expliciet heb aangegeven wat het eigenlijk precies zou moeten zijn - mimetypes zijn er doorgaans niet voor niets...
Mjah goochelarij, hij parsed gewoon de xml/(x)html die je meegeeft. Dat maakt voor de interne engine niet uit en maakt het natuurlijk heel makkelijk om alles op dezelfde manier aan te spreken.

Als het iets anders is dan moet je het gewoon niet parsen met jQuery :+

Het handelsmerk van jQuery is eenvoudigheid.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:25

crisp

Devver

Pixelated

Bosmonster schreef op vrijdag 08 januari 2010 @ 10:28:
[...]
Het handelsmerk van jQuery is eenvoudigheid.
In dit geval eerder obscuriteit, en ik kan me situaties voorstellen waarbij dit ongewenst gedrag oplevert en je je vervolgens het ongans zoekt naar de oorzaak wat dan uiteindelijk blijkt te liggen in het feit dat jQuery allerlei aannames maakt op basis van de (mogelijk foute) input. Een beetje weaktyping in het extreme doorgetrokken...

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bosmonster schreef op vrijdag 08 januari 2010 @ 10:15:
Jouw voorbeeld geeft bij mij gewoon "test tekst" en "2".

jQuery 1.3.2 en natuurlijk in documentready. Veel meer dan dat is er niet te doen :)
MueR schreef op vrijdag 08 januari 2010 @ 10:15:
Ik vermoed dat je toch wat beter moet debuggen. Ik kopieer je code net namelijk letterlijk en hij werkt gewoon. Waarschijnlijk zit er iets anders te vervelen in je code.

edit: laat
Kut. Jullie hebben gelijk, wanneer ik het in een andere browser doe dan IE6 dan werkt het idd. Maar ja, het moet helaas ook in IE6 werken.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:31

MueR

Admin Tweakers Discord

is niet lief

Probeer het voor de grap eens gewoon. Haal met ajax een XML file van je server op en ga die parsen. Zal vast beter werken dan de door crisp lief benoemde 'gochelarij'.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

crisp schreef op vrijdag 08 januari 2010 @ 10:39:
[...]

In dit geval eerder obscuriteit, en ik kan me situaties voorstellen waarbij dit ongewenst gedrag oplevert en je je vervolgens het ongans zoekt naar de oorzaak wat dan uiteindelijk blijkt te liggen in het feit dat jQuery allerlei aannames maakt op basis van de (mogelijk foute) input. Een beetje weaktyping in het extreme doorgetrokken...
Je kiest er toch voor om de x(ht)ml te parsen door hem zo aan te roepen met jQuery? Wat verwacht je anders als je een string die parser in mikt? jQuery functionaliteit zet de string die je meegeeft om naar een elementstructuur, of dit nu een $('<div>test</div>') is of een $(xml-meuk). Heeft weinig met weaktyping te maken imho, iets anders pakt ie niet.

[ Voor 14% gewijzigd door Bosmonster op 08-01-2010 11:18 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14-09 17:03

Creepy

Tactical Espionage Splatterer

Hmm, crisp heeft wel een punt:
Uit de jQuery docs
A string of HTML to create on the fly. Note that this parses HTML, *not* XML.


All HTML must be well-formed, otherwise it may not work correctly across all browsers. This includes the case where $("<span>") may not work but $("<span/>") will (note the XML-style closing slash).
Een string wordt dus altijd als HTML geparsed. Om daadwerkelijk goed om te gaan met XML moet je er een Document of een Element aan meegeven.

[ Voor 10% gewijzigd door Creepy op 08-01-2010 11:38 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:25

crisp

Devver

Pixelated

Bosmonster schreef op vrijdag 08 januari 2010 @ 11:16:
[...]


Je kiest er toch voor om de x(ht)ml te parsen door hem zo aan te roepen met jQuery? Wat verwacht je anders als je een string die parser in mikt?
Een error?
jQuery functionaliteit zet de string die je meegeeft om naar een elementstructuur, of dit nu een $('<div>test</div>') is of een $(xml-meuk). Heeft weinig met weaktyping te maken imho, iets anders pakt ie niet.
Mja, like I said: het is goochelarij. content-sniffing (ik neem aan dat jQuery dat doet om te bepalen of iets HTML of XML is) is een bad practice aangezien het tot foute resultaten kan leiden. Waarom zou je niet '<div>test</div>'.toHTML() en xmlstring.toXML() doen? Dat geeft heel expliciet aan wat de bedoeling is en maakt je code dus vele malen duidelijker.

Maar goed, ik heb jQuery altijd al als een soort doos van Pandora gezien met Frankensteinesque trekjes; niet mijn favoriete library dus ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

crisp schreef op vrijdag 08 januari 2010 @ 11:41:
Mja, like I said: het is goochelarij. content-sniffing (ik neem aan dat jQuery dat doet om te bepalen of iets HTML of XML is) is een bad practice aangezien het tot foute resultaten kan leiden. Waarom zou je niet '<div>test</div>'.toHTML() en xmlstring.toXML() doen? Dat geeft heel expliciet aan wat de bedoeling is en maakt je code dus vele malen duidelijker.

Maar goed, ik heb jQuery altijd al als een soort doos van Pandora gezien met Frankensteinesque trekjes; niet mijn favoriete library dus ;)
Hij doet geen content-sniffing, maar behandelt alles hetzelfde. Foute x(ht)ml krijg je dus een error op.

je toHTML() en toXML() functionaliteiten druisen in tegen de jQuery filosofie om niet bestaande objecten uit te breiden (zoals prototype, das niet mijn favoriete library met een onnodig complexe API en extreme vervuiling van de global namespace). Daarnaast voegt dit weer functionaliteit toe die eigenlijk niet nodig is in 99,9% van de gevallen, en druist dus ook op dat vlak in tegen de jQuery KISS-filosofie.

In de meeste gevallen zijn de dingen die je wilt maar simpel. Je hebt een XML file of HTML string/file en wilt deze parsen en er iets mee doen. Mik hem in jQuery en je kunt hem met de selector-engine benaderen. Simpel zat. Uiteindelijk gaat het gewoon om dezelfde opbouw toch?

Ja jQuery maakt een hoop beslissingen voor je, waardoor de API heel eenvoudig kan blijven. In 99,9% van de gevallen heb je ook niet meer nodig en kun je hierdoor veel sneller ontwikkelen dan in andere libraries en met veel minder code. Wil je echter 100% controle en complexe applicaties ontwikkelen, dan is jQuery inderdaad niet geschikt.

[ Voor 15% gewijzigd door Bosmonster op 08-01-2010 12:32 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:25

crisp

Devver

Pixelated

Bosmonster schreef op vrijdag 08 januari 2010 @ 12:28:
[...]


Hij doet geen content-sniffing, maar behandelt alles hetzelfde. Foute x(ht)ml krijg je dus een error op.
HTML en XML zijn niet hetzelfde, jQuery zal toch op een of andere manier moeten bepalen of hij met XML of met HTML te maken heeft?
Je toHTML() en toXML() functionaliteiten druisen in tegen de jQuery filosofie om niet bestaande objecten uit te breiden (zoals prototype, das niet mijn favoriete library met een onnodig complexe API en extreme vervuiling van de global namespace).
Ik ben niet tegen uitbreiden van bestaande objecten (enkel Object moet je vanaf blijven). Eens @ prototype dat het bloated is en de global namespace nogal vervuilt, maar wel een mooie library om uit te cherry-picken :)

[ Voor 40% gewijzigd door crisp op 08-01-2010 12:36 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Creepy schreef op vrijdag 08 januari 2010 @ 11:36:
Hmm, crisp heeft wel een punt:

[...]

Een string wordt dus altijd als HTML geparsed. Om daadwerkelijk goed om te gaan met XML moet je er een Document of een Element aan meegeven.
Inderdaad. Intern worden er toevallig wat functies door jQuery's parser gebruikt, die onder een aantal browers toevallig ook XML kunnen parsen. (Overigens gaan er een aantal geloof ik nog steeds op hun gat wanneer je ze alleen een XML fragment voert ipv een heel XML document met xml-version tag, single root node, etc., maar dat weet ik niet zeker.)

[ Voor 3% gewijzigd door R4gnax op 09-01-2010 12:34 ]

Pagina: 1