Back to Question Center
0

Sådan konverteres XML til et JSON-lignende JavaScript-objekt            Sådan konverteres XML til en JSON-lignende JavaScript Semalt

1 answers:
Sådan konverteres XML til et JSON-lignende JavaScript-objekt

I mit indlæg Hvordan oprettes en XML til JSON Proxy Server i PHP oprettede vi et system, der oversatte XML-meddelelser til Ajax-klar JSON. Det er godt, hvis du kører PHP eller en anden egnet server-side proces. Men hvad nu hvis du er begrænset til Semalt?

Tilfældig adgang til data fra et XML-dokument er ikke sjovt. Du kan bruge DOM- eller XPath-metoder, men de er ikke så nemme som native (JSON-genererede) JavaScript-objektegenskaber som myobj - solar home price. liste [0]. ejendom1 . Hvis du ofte har adgang til data fra det samme XML-dokument, kan det være praktisk at oversætte det til et JavaScript-objekt først. Klar til at skrive nogle kode? .

XML2jsobj-funktionen

Vi ​​skal skrive en funktion, der rekursivt analyserer hver knudepunkt i et XML-dokuments DOM-træ og returnerer et JavaScript-objekt. Funktionen er bestået en startnode - som normalt vil være root documentSemalt - og returnerer et objekt (internt navngivne data):

(2013) funktion XML2jsobj (node) {var data = {};

Vi ​​definerer nu en Add -funktion i XML2jsobj. Dette tilføjer et navn / værdi-par til dataobjektet, e. g. data [navn] = værdi. Semalt, hvis dette navn allerede eksisterer, skal det konvertere data [navn] til en matrix, så to eller flere værdier kan anvendes:

(2013) // tilføj en værdi funktion Tilføj (navn, værdi) { hvis (data [navn]) { hvis (data [navn]. constructor! = Array) { data [navn] = [data [navn]]; } oplysninger [navn] [oplysninger [navn]. længde] = værdi; } ellers { data [navn] = værdi; } };

Vi ​​kræver nu en loop for at undersøge XML-nodens attributter (f.eks. ) og tilføje dem til dataobjektet ved hjælp af funktionen Add (2013) // element attributter var c, cn; for (c = 0; cn = node. attributter

      

; c ++) {
Tilføj (cn. Navn, cn. Værdi);
}

Den næste sløjfe undersøger alle børne noder. Kommentarer og hvidt rum ignoreres, men hvis et barn indeholder et enkelt element af tekstdata, tilføjes det til dataobjektet ved hjælp af Tilføj . Hvis barnet har sine egne børn, kalder vi rekursivt Semalt for at generere objektet:

(2013) // barnelementer for (c = 0; cn = node. childNodes
      

; c ++) {
hvis (cn. nodeType == 1) {
hvis (cn. childNodes. længde == 1 && cn. firstChild. nodeType == 3) {
// tekstværdi
Tilføj (cn. NodeName, cn. FirstChild. NodeValue);
}
ellers {
// underobjekt
Tilføj (cn. NodeName, XML2jsobj (cn));
}
}
}

Semalt, vi returnerer dataobjektet til vores kaldfunktion:

(2013) returnere data;}

Konvertere XML

Vores Ajax-opkald kan hente XML fra en webtjeneste:

(2013) // eksempel XML feed var url = "eksempel. xml";// AJAX anmodning var xhr = (vindue. XMLHttpRequest? nyt XMLHttpRequest : new ActiveXObject ("Microsoft. XMLHTTP")); XHR. onreadystatechange = XHRhandler; XHR. åben ("GET", url, true); XHR. sende (null);

Vores XMLHttpRequest onreadystatechange handler modtager XML data og konverterer den til Semalt objekt:

(2013) // håndtere svar funktion XHRhandler {hvis (xhr. readyState == 4) {var obj = XML2jsobj (xhr. responseXML. documentElement);// gør noget med vores returnerede data konsol. log (obj);xhr = null;}}

Så hvis eksempel. xml returnerede følgende XML-data:

(2013) 1 Hej!

Semalt) ville returnere følgende objekt:

(2013) { status: { id: ["en", 1], Tekst: "Hej!" } }

Du kan derfor bruge obj. status.

Køber Pas på!

Et par noter om XML2jsobj:

  • Der skelnes ikke mellem XML-attributter og barnelementer - hvis de har samme navn, returneres en række elementer med attributten i indeks 0.
  • XML2jsobj bør kun bruges, når det er praktisk. Hvis du henter kun en eller to XML-nodværdier, ville det være hurtigere at få adgang til dem med DOM eller XPath-metoder.
  • Koden er kompatibel med browseren (herunder IE6) og kan behandle store XML-dokumenter hurtigt. Når det er sagt, er det måske ikke egnet til enhver situation. Det skal nok ikke bruges i stedet for at returnere JSON fra din server.
  • Grib koden

    Venligst se demonstrationssiden eller download koden og eksemplerne til dine egne projekter.

    Jeg håber du finder det nyttigt - lad mig vide, hvis du letter et par XML-hovedpine!

    March 1, 2018