Diese Anzeige ist nur für
Nicht-Mitglieder sichtbar!

Jetzt kostenlos registrieren

Werte beim Auslesen einer XML-Datei in Array speichern

Fragen zum Thema JavaScript können hier gestellt werden

Moderatoren: Basti, Guillermo, Ingo

Werte beim Auslesen einer XML-Datei in Array speichern

Beitragvon Sven am 31.07.2011, 13:52

Hallo,

momentan programmiere ich fleißig an meiner Galerie, wo auch die Exif-Daten der Bilder angezeigt werden sollen.
Hierbei werden die einzelnen Daten (Dateiname, Exif-Daten) in XML abgespeichert und mit JavaScript ausgelesen.


Damit nicht bei jedem Öffnen eines Bildes ein Ajax-Request an den Server gesendet werden muss, lese ich die XML-Datei beim erstmaligen Laden der Webseite und speichere diese in zwei assoziativen Arrays, für den späteren Gebrauch. Array 1 (image) ist hierbei für den Bildnamen und zeigt auf Array 2 (exif), welches die Exif-Daten des Bildes enthält.

Die Struktur der Arrays ist wie folgt:
exif["camera"] = "Kameraname";
exif["lens"] = "Objektivname";
... usw ...
image["bildname"] = exif;


Ich möchte die Daten später so ansprechen können:
image["0_1"]["camera"]


Soviel zur Theorie. In der Praxis funktioniert es nicht ganz so, wie ich es möchte.

Die XML-Datei sieht zum Beispiel so aus:
Code: Alles auswählen
<?xml version="1.0" ?>
<gallery>
   <image file="0_1">
      <exif>
         <camera>Nikon D700</camera>
         <lens>Nikkor 50mm f1.4G AF-S</lens>
         <mm>50</mm>
         <f>1.4</f>
         <s>1/2000</s>
         <iso>200</iso>
      </exif>
   </image>
   <image file="0_2">
      <exif>
         <camera>Nikon D90</camera>
         <lens>Nikkor 18-105mm f3.5-5.6 VR</lens>
         <mm>18</mm>
         <f>3.5</f>
         <s>1/125</s>
         <iso>1000</iso>
      </exif>
   </image>
   <image file="0_3">
      <exif>
         <camera>Nikon D80</camera>
         <lens>Sigma 17-35mm f2.8-4 HSM</lens>
         <mm>17</mm>
         <f>11</f>
         <s>1/60</s>
         <iso>200</iso>
      </exif>
   </image>
   <image file="0_4">
      <exif>
         <camera>Nikon D70</camera>
         <lens>Nikkor 50mm f1.4G AF-S</lens>
         <mm>50</mm>
         <f>2.8</f>
         <s>1/1000</s>
         <iso>200</iso>
      </exif>
   </image>
</gallery>



und so lese ich das aus:
Code: Alles auswählen
// Build arrays for exif-data   
function getExifs(xmlFile){
   var image = new Array();
   var exifData = new Array();
   $.ajax({ url : "templates/gallery/"+xmlFile+".xml",
      async : false,
      success : function(xml){
         $("image", xml).each(function(){
            exifData["camera"] = $(this).find("camera").text();
            exifData["lens"] = $(this).find("lens").text();
            exifData["mm"] = $(this).find("mm").text();
            exifData["f"] = $(this).find("f").text();
            exifData["s"] = $(this).find("s").text();
            exifData["iso"] = $(this).find("iso").text();
            image[$(this).attr("file")] = exifData;
            console.log("CurrentState: image["+$(this).attr("file")+"] = "+image["0_1"]["camera"]);
         });
         console.log("image.length: "+image.length);
      }
   });
   return image;
}

// get EXIF data
var exifs = getExifs("city");


Somit müsste ich über exifs[imageId]["camera"] die Daten für jedes Bild dynamisch abrufen können.
Die Ausgabe sieht dann so aus:

Code: Alles auswählen
// show EXIFs, var i is the current image number
$('div#exifsWrapper').html('<div class="exifs"><b>Exif-Data:</b> '+exifs[i]['camera']+' + '+exifs[i]['lens']+' | '+exifs[i]['mm']+' mm | f/'+exifs[i]['f']+' | '+exifs[i]['s']+' s | ISO '+exifs[i]['iso']+'</div>');


Nur leider wird immer nur der letzte Eintrag in der XML-Datei ausgegeben.


Wenn ich testweise anstatt
exifs[imageId]["camera"]
jetzt
exifs["0_1"]["camera"]
manuell eintippe, bekomme ich eine Fehlermeldung, dass dieser Index nicht existiert.


Die console.log-Ausgaben im obigen Quellcode sehen in Firebug wie folgt aus:
CurrentState: image[0_1] = Nikon D700
CurrentState: image[0_2] = Nikon D90
CurrentState: image[0_3] = Nikon D80
CurrentState: image[0_4] = Nikon D70
image.length: 0

Das zeigt mir, dass image garnicht erst gefüllt worden ist und die Daten immer wieder bei image["0_1"]["camera"] eingespeichert werden, denn sonst würde ja immer nur die D700 ausgegeben werden.


Seht ihr in meinem Code einen Fehler? Ich weiß da momentan echt nicht mehr weiter...

Grüße,
Sven
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa - Satzzeichen retten Leben.

Thomas Tremmel: Mein Nachbar Kurt
Unterhaltsame Geschichten aus der Fotografie.
Benutzeravatar
Sven
Moderator
 
Beiträge: 2212
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal
Diese Anzeige ist nur für
Nicht-Mitglieder sichtbar!
 
Jetzt kostenlos registrieren

Re: Werte beim Auslesen einer XML-Datei in Array speichern

Beitragvon my-webdesigner.com am 31.07.2011, 13:59

Hallo Sven,

ich empfehle dir das Modell ein wenig umzudenken:
Wenn die Bilder hochgeladen werden, kannst du die EXIF-Infos auslesen. Das klappt ja bei dir soweit schon.
Dann würde ich sie als JSON-String speichern (in der Datenbank oder einem einzelnen File zu jedem Bild).

bild-001.jpg
exif-001.json

Per Ajax kannst du dann direkt auf den JSON-String zugreifen (exif-001.json) und brauchst nicht einmal den XML-Parser zu bemühen.
Benutzeravatar
my-webdesigner.com
Mitglied
 
Beiträge: 656
Registriert: 20.04.2010, 12:42
Wohnort: Wien

Re: Werte beim Auslesen einer XML-Datei in Array speichern

Beitragvon Sven am 31.07.2011, 18:10

Hi,

stimmt JSON wäre auch eine gute (bessere) Möglichkeit gewesen. Vielleicht stelle ich das auch beizeiten um.
Ich habe es jetzt allerdings hinbekommen - zwar ein wenig umständlich, aber immerhin.


Das Problem war, dass immer alle Indizes von image mit jedem Durchlauf überschrieben worden sind. Vermute mal, es lag daran, dass ich immer auf exifData zeigen ließ, kann das sein?


Nun habe ich es so gelöst, dass ich für jedes Bild einen eigenen Index angelegt habe:
Code: Alles auswählen
         // Build arrays for exif-data   
         function getExifs(xmlFile){
            var exifData = new Array();
            $.ajax({ url : "templates/gallery/"+xmlFile+".xml",
               async : false,
               success : function(xml){
                  $("image", xml).each(function(){
                     var attr = $(this).attr("file");
                     exifData["camera"+attr] = $(this).find("camera").text();
                     exifData["lens"+attr] = $(this).find("lens").text();
                     exifData["mm"+attr] = $(this).find("mm").text();
                     exifData["f"+attr] = $(this).find("f").text();
                     exifData["s"+attr] = $(this).find("s").text();
                     exifData["iso"+attr] = $(this).find("iso").text();
                  });
                  
               }
            });
            return exifData;
         }
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa - Satzzeichen retten Leben.

Thomas Tremmel: Mein Nachbar Kurt
Unterhaltsame Geschichten aus der Fotografie.
Benutzeravatar
Sven
Moderator
 
Beiträge: 2212
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal


Zurück zu JavaScript

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste