• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] XML Parsen und auswerten

dbarthel

Lounge-Member
Hallo,

ich möchte auf meiner Webseite Dokumente zum herunterladen anbieten.
Jedes Dokument hat dabei seine eigene ID.

Nun soll via Script einer XML nachgesehen werden, ob die ID auf einem bestimmten Anbieter vorhanden ist, oder nicht.
Ist die ID bei einem Anbieter vorhanden, soll der, ebenfalls in der XML gespeicherte, entsprechende Link dazu ausgelesen und später in HTML-Code eingebunden und dieser dann angezeigt werden.

Dazu habe eine XML mit folgenden Inhalt:

Code:
<?xml version="1.0"?>
<xml>
 <provider>
  <text>oboom</text>
   <id>111</id>
    <link>www.test.de</link>
   <id>121</id>
    <link>www.test2.de</link>
 </provider>
 <provider>
  <text>longfiles</text>
   <id> </id>
    <link> </link>
   <id>131</id>
    <link>www.test3.de</link>
 </provider>
</xml>

Dazu gibt es folgendes (noch nicht fertiges) Script:

Code:
$(document).ready(
                  function() 
                  {
                   //lets load our links
                    $.ajax(
                           {
	                    type: "GET",
	                    url: "./links.xml",
	                    dataType: "xml",
	                    success: function(xml)
                                     {
                                      $(xml).find('provider').each (
                                                                  function()
                                                                  {
				                                   var prov = $(this).find("text").text();
				                                   if (prov == "oboom")
                                                                     {
                                                                      $(prov).find('id').each (
                                                                                               function()
                                                                                               {
                                                                                                var ids = $(prov).find("id").text();
                                                                                                if (ids == "111")
                                                                                                  {
                                                                                                   var link = $(ids).find("link").text();
                                                                                                   alert(link);
                                                                                                  }
                                                                                               }
                                                                                              );
					                              
                                                                     } 
					                          }
                                                                 );

                                     },
	                    error: function(xml)
                                   {
                                    alert('Error loading XML data');
                                   }
                           }
                          );
                  }
                 );

dazu habe ich mir gedacht, das erstmal die xml gelsen wird und mit
Code:
 $(xml).find('provider').each (
                                                                  function()
                                                                  {
				                                   var prov = $(this).find("text").text();
der Inhalt von Provider ausgelesen wird.
Nun soll verglichen werden, ob dieser Wert einen bestimmten Eintrag entspricht (später wird hier eine Variable übergeben, zu Testzwecken habe ich einfach nur einem Schreibtisch-Test mit einem bestimmten Wort genommen);
ist diese der Fall, sollen alle IDs von diesem Provider gelesen werden:
Code:
if (prov == "oboom")
                                                                     {
                                                                      $(prov).find('id').each (
woraufhin wieder die Ids mit einem bestimmten Wert (dieser wird später per location.search an das Script übergeben) verglichen werden.
Wird die ID gefunden, soll der Wert von Links ausgelesen und ausgegeben werden.

ABER: Es passiert einfach gar nichts!

Was mache ich falsch?


Bitte antwortet mir möglichst Idiotensicher!
 
Zuletzt bearbeitet von einem Moderator:
habe die links.xml nochmal etwas umstrukturiert:

Code:
<?xml version="1.0"?>
<xml>
 <provider>
  <text>oboom</text>
  <ids>
   <id>111</id>
   <id>121</id>
  </ids>
  <links>
    <link>www.test.de</link>
    <link>www.test2.de</link>
  </links>
 </provider>
 <provider>
  <text>longfiles</text>
  <ids>
   <id>111</id>
   <id>121</id>
  </ids>
  <links>
    <link>www.test.de</link>
    <link>www.test2.de</link>
  </links>
 </provider>
</xml>

und den js-code wie fiolgt geändert:

Code:
$(document).ready(
                  function() 
                  {
                   //lets load our questions
                    $.ajax(
                           {
	                    type: "GET",
	                    url: "./links.xml",
	                    dataType: "xml",
	                    success: function(response)
                                     {
                                      var xml = $(response);
                                      $(xml).find("provider").each(function()
                                                                   {
                                                                    var prov = $(this).find("text").text();alert(prov);
                                                                    $(this).find("ids").each(function()
                                                                                             {
                                                                                              var id = $(this).find("id").text();alert(id);
                                                                                              $(this).find("links").each(function()
                                                                                                                         {
                                                                                                                          var linker = $(this).find("link").text();alert(linker);
                                                                                                                         }
                                                                                                                        );
                                                                                             }
                                                                                            );
                                                                   }
                                                                  ); 

                                     },
	                    error: function(xml)
                                   {
                                    alert('Error loading XML data');
                                   }
                           }
                          );
                  }
                 );

nun werden provider und ids ausgegeben, beim link allerdings fehlanzeige!

Außerdem habe ich hier noch keinen Vergleich eingebaut und kann somit auch nicht nur einen bestimmten Link extrahieren, doch genau das möchte ich.

Kann mir bitte jemand helfen und, wenn möglich, ein Stück Code schreiben, das diesen Vergleich macht.

Ansonsten bitte wenigstens, möglichst detailliert eine Idee aufzeigen, wie man das machen könnte.
 
Zuletzt bearbeitet:
Deine XML-Struktur sagt

Code:
- provider
   - ids
      - id
   - links
      - link

Dein Code verschachelt die .each() Aufrufe allerdings so, als ob folgendes gelten müsste
Code:
- provider
   - ids
      - id
      - links
         - link
Das heißt, Du verschachtelst die links-Schleife innerhalb der ids-Schleife. Die links-Schleife muss aber hinter die ids-Schleife (auf gleicher Verschachtelungsebene unterhalb von provider)
 
Ja, stimmt. Danke.

Jetzt funktioniert zwar das auslesen prinzipiell, aber wenn ich nun den Vergleich aus dem ersten Code anwende, haut es dennoch nicht so hin, das wenn Anbieter "oboom" und ID "111" ist, mir für Link der Wert "www.test.de" geliefert wird.
Ich erhalt jetzt einfach entweder alle Ids und Links oder gar nichts, nicht jedoch nur den Link für ID 111.

Könnte man mich dahingehend noch etwas erleuchten.
 
Zeig doch nochmal Deinen aktuellen Code und dreh die Einrückungen ein wenig runter :)

Grundsätzlich würde ich sagen, dass Dein erster Code an der Stelle falsch ist, wo Du $(prod).find() machst. Warum nimmst Du hier nicht $(this).find()? Du bist im richtigen Provider, falls der Vergleich prov=="oboom" zutrifft. Damit enthält "this" schon den aktuellen Provider, von dem Du die ids holen willst. Dann könntest Du ein .each() über diese ids machen und dann den id-Inhalt mit "111" vergleichen. Und auch an dieser Stelle dann wieder $(this) und nicht etwa $(id) verwenden.
 
Werde ich morgen machen, dann kann ich gleich noch was ausbauen, das Script, falls was anderes auch nicht funktioniert... könnt mir dan geballt helfen
 
So, muss jetzt doch nochmal zwischenfragen.

XML wie folgt:
Code:
<?xml version="1.0"?>
<xml>
 <provider>
  <text>oboom</text>
  <options>
   <id>111</id>
    <link>www.test.de</link>
   <id>112</id>
    <link>www.test2.de</link>
  </options>
 </provider>
 <provider>
  <text>longfiles</text>
  <options>
   <id>111</id>
    <link>www.test3.de</link>
   <id>112</id>
    <link>www.test4.de</link>
  </options>
 </provider>
</xml>

script wie folgt:
Code:
$(document).ready(
                  function() 
                  {
                   //lets load our links
                    $.ajax(
                           {
	                    type: "GET",
	                    url: "links.xml",
	                    dataType: "xml",
	                    success: function(response)
                                     {
                                      var xml = $(response);
                                      $(xml).find("provider").each(function()
                                                                   {
                                                                    var prov = $(this).find("text").text();alert(prov);
                                                                    $(this).find("options").each(function()
                                                                                                 {
                                                                                                  var ids = $(this).find("id").text();
                                                                                                  alert(ids);
                                                                                                  if (id == 111)
                                                                                                    {
                                                                                                     $(this).find("link").each(function()
                                                                                                                               {
                                                                                                                                var linker = $(this).find("link").text();
                                                                                                                                alert(linker);
                                                                                                                               }
                                                                                                                              );
                                                                                                    }
                                                                                                  else {alert('nächste id: ' + ids);}
                                                                                                 }
                                                                                                );

                                                                   }
                                                                  ); 

                                     },
	                    error: function(xml)
                                   {
                                    alert('Error loading XML data');
                                   }
                           }
                          );
                  }
                 );

problem ist, ich bekomme an der stelle
Code:
var ids = $(this).find("id").text();
 alert(ids);

logischerweise den wert 111112, da es ja beide ids gibt. insofern ist die bedingung " if (id == 111)" niemals zu erfüllen, ergo lässt sich auch der entsprechende Link dazu nicht extrahieren.

habe ich da jezt einen genereleln dankfehler, ist nur wider das script bzw. die xml falsch notiert oder wie könnte man dieses Problem lösen?
 
Du solltest im XML die id zusammen mit dem passenden Link gruppieren

Beispiel
Code:
<?xml version="1.0"?>
<xml>
 <provider>
  <text>oboom</text>
  <options>
   <option>
   <id>111</id>
    <link>www.test.de</link>
   </option>
   <option>
   <id>112</id>
    <link>www.test2.de</link>
   </option>
  </options>
 </provider>
 <provider>
  <text>longfiles</text>
  <options>
   <id>111</id>
    <link>www.test3.de</link>
   <id>112</id>
    <link>www.test4.de</link>
  </options>
 </provider>
</xml>

und dann halt die Schleife über "option" statt über "options" durchführen. Damit hast Du für jede "option" nur genau den Text (und den Link) zu genau einer ID.
Code:
$(this).find("option").each(function() {
   var ids = $(this).find("id").text();

Noch einmal der Hinweis zu Deinen Einrückungen ... Du verwendest eine sehr seltsame und ziemlich unleserliche Einrückungsmethode. Irgendwie möchtest Du gerne die öffnende geschweifte Klammer direkt unter dem "function" Schlüsselwort sehen, und damit werden Folgezeilen extrem eingerückt. Üblicherweise stellt man die öffnende geschweifte Klammer entweder direkt hinter die "function" oder "if" Zeile (wie in meinem Beispiel) oder eine Zeile darunter mit derselben Einrückung wie die Vorzeile
Code:
$(this).find("option").each(function()
{
   var ids = $(this).find("id").text();
 
Brauche nochmal Hilfe.

Habe nun bemerkt, das jeweils nur ein Anbieter ausgeliefert wird und zwar mit falscher ID
Es sollen jedoch ALLE Anbieter, die diese (die richtige) ID haben, mit einsprechendem, Link ausgegeben werden, siehe Script:

Code:
var wert=111, provider, id, link="";
var providerliste = new Array("");
var linkliste = new Array("");

function Werteliste (querystring) {
if (querystring == '') return;
  var wertestring = wertestring.slice(1);
  var paare = wertestring.split("&");
  var paar, name, wert;
  for (var i = 0; i < paare.length; i++) {
    paar = paare[i].split("=");
    wert = paar[0];
    wert = unescape(wert).replace("+", " ");
    return wert;
  }
}

$(document).ready(function() 
{
 //lets pickup the string into the location
//wert = new Werteliste(location.search);
 //lets load our links
 $.ajax(
 {
 type: "GET",
 url: "links.xml",
 dataType: "xml",
 success: function(xml){
 //lets do some reading
  $(xml).find('provider').each(function()
  {
  provider = $(this).find("text").text();
  $(this).find("option").each(function() 
  {
  id = $(this).find("id").text();
  if (id == wert)
    {
     link = $(this).find("link").text();alert(link);
     providerliste.push(provider);
     linkliste.push(link);
    }
  });
 });

for (i = 1; i < providerliste.length; i++)
 {
  alert('In Provider ' + providerliste[i] + ' wurde die ID ' + id + ' gefunden.\nDer Link dazu ist: ' + linkliste[i]);
 }

},
error: function(response)
{
 alert('Error loading XML data');
}
});
});

Liefert immer nur "in provider oboom wurde die id 112 gefunden, der link dazu ist test.de", obwohl die ID ja 111 ist.

Da die ID 111 aber auch bei longfiles vorhanden ist, mit www.test3.de, möchte ich natürlich auch diesen haben,
also ALLE Provider, die die entsprechende ID haben, mit dem entsprechendem Link dazu!

Stehe da momentan auf dem Schlauch. Bitte nochmal helfen!

PS: XML:
Code:
<?xml version="1.0"?>
<xml>
 <provider>
  <text>oboom</text>
  <options>
   <option>
   <id>111</id>
    <link>www.test.de</link>
   </option>
   <option>
   <id>112</id>
    <link>www.test2.de</link>
   </option>
  </options>
 </provider>
 <provider>
  <text>longfiles</text>
  <options>
   <id>111</id>
    <link>www.test3.de</link>
   <id>112</id>
    <link>www.test4.de</link>
  </options>
 </provider>
</xml>
 
Zuletzt bearbeitet:
Du speicherst ja die id für die gefundenen Werte nirgends, deswegen hat diese Variable in Deiner Ausgabe den letzten Wert (also den ID-Wert des letzten durchsuchten Elements)

Warum gibst Du den alert nicht innerhalb der Schleife aus ... an der Stelle, an der jetzt nur alert(link) steht? Dort hast Du doch den Provider, die ID und den Link verfügbar.
 
Du speicherst ja die id für die gefundenen Werte nirgends, deswegen hat diese Variable in Deiner Ausgabe den letzten Wert (also den ID-Wert des letzten durchsuchten Elements)

Warum gibst Du den alert nicht innerhalb der Schleife aus ... an der Stelle, an der jetzt nur alert(link) steht? Dort hast Du doch den Provider, die ID und den Link verfügbar.

Der Alert ist nur ein Tests. Eigentlich soll dann im aufrufenden Dokument für jeden Anbieter, der die Id hat code ala <div id="+PROVIDER+" style="Display:block"><a href="+Link+">+Provider+</a></div>
eingefügt werden.
Für jeden Provider, der die ID nicht hat soll "Display: none" gelten.

Der Code soll dabei aber nicht direkt ins Dokument geschrieben werden sondern in eine Variable, daher auch der Code am Ende, denn es sollen ja immer Alle Anbieter ausgegeben werden.

Die, welche die geforderte Id haben sind sichtbar und haben einen Link, alle Anbieter, welche die geforderte Id nicht haben, sollen unsichtbar sein.
 
Zuletzt bearbeitet:
Dann würde ich da unten bei der Ausgabe auch "wert" verwenden (den gesuchten Wert) und nicht "id" (dessen Wert sich ja ständig ändert). Ginge das?

EDIT: Und natürlich(!) bei 0 anfangen zu zählen
Code:
for (i = 0; i < providerliste.length; i++)
 {
  alert('In Provider ' + providerliste[i] + ' wurde die ID ' + wert + ' gefunden.\nDer Link dazu ist: ' + linkliste[i]);
 }
 
Bei 0 anfangen? Bekomme ich an der Stelle 0 nicht, wie oben im Array (=new Array ("") definiert ""?

Ansonsten müsste doch übrigens Provider an Stelle 1 doch inzwischen eher Longfiles (da dieser weiter hinten im XML ist) und nicht mehr oboom sein, oder?


Irgendwie scheinen nicht alle Provider Einträge in mein Array gepucht zu werden, sondern nur der Provider bei dem zuerst die id dem Wert von wert entspricht.


Zur Ergänzung. Der Div-Code soll natürlich nicht direkt ins Dokument, sondern in eine Variable( nebst weiteren code).
Der Inhalt dieser Variable mit dem Code soll via $(.provider).html (variable) dann Code im Dokument ersetzen...
Am Ende soll eine Art Tabelle rauskommen mit den Logos Aller Provider. Das Logo der Provider, die einen Link haben ist sicht- und klickbar, alle anderen Logos sind ausgegraut.


PS: die Ausgabe der ID brauche ich nicht zwingend, hatte das nur testweise mit rein gemacht, aber war ja eh falsch, denn ist ja wert. ;)

- - - Aktualisiert - - -

Nachtrag.
Habe noch mal an der Stelle eo bisher nur alert link steht auch provider ausgeben lassen und das liefert dort nur oboom, die gefragte id gibts aber im xml auch bei longfiles.

Wo steckt der Fehler?
 
Zuletzt bearbeitet:
Ja, Arrays sollten auch nicht mit dem Array-Konstruktor erstellt werden (klingt unlogisch, ich weiß), sondern als []
Code:
var providerliste = [];
var linkliste = [];

Dann würde ich wert als String und nicht als Zahl initialisieren ... Du vergleichst sonst Äpfel mit in Äpfeln umgewandelten Birnen
Code:
var wert = "111";

EDIT: Und pack doch mal an alle entscheidenden Stellen (also z.B. an den Anfang jeder .each()-Schleife) ein console.log ... damit kriegst Du mit, ob alle provider durchlaufen werden

EDIT2: Hah, gefunden! Du hast beim zweiten Provider nicht die <option> eingebaut.
 
Zuletzt bearbeitet:
Danke dir Dev, finde ich ech super deine Hilfe.

Ich werde deine Anregungen morgen umsetzen und mich dann wieder melden, hab jetzt den Rechner aus und nur vom Handy reingeschaut.

Ps: hast du auch eine Idee, wie ich das mit dem "ausgrauen" der Logos machen könnte?
Blur () auf ein Image Tag
<Img src="logo.jpg" style="this.blur ()">
Bin mir grad nicht sicher ob das geht.

Aber erstmal schauen, ob morgen die Linkliste will, wie ich will.
Hoffe, du bist auch weiterhin so hilfsbereit, falls Probleme auftreten.
 
Habe das ganze nochmal etwas geändert.

Die XML sieht nun so aus:

Code:
<?xml version="1.0"?>
<xml>
 <provider>
  <text>oboom</text>
  <options>
   <option>
   <id>111</id>
    <link>www.test.de</link>
   </option>
   <option>
   <id>112</id>
    <link>www.test2.de</link>
   </option>
  </options>
 </provider>
 <provider>
  <text>longfiles</text>
  <options>
   <option>
   <id>111</id>
    <link>www.test3.de</link>
   </option>
   <option>
   <id>114</id>
    <link>www.test4.de</link>
   </option>
  </options>
 </provider>
</xml>

und das Script so:
Code:
var wert="111", provider, id, link="";
var providerliste = [];
var linkliste = [];
var htmlStructure ="";
var linkStructure ="";

function Werteliste (querystring) {
if (querystring == '') return;
  var wertestring = wertestring.slice(1);
  var paare = wertestring.split("&");
  var paar, name, wert;
  for (var i = 0; i < paare.length; i++) {
    paar = paare[i].split("=");
    wert = paar[0];
    wert = unescape(wert).replace("+", " ");
    return wert;
  }
}

$(document).ready(function() 
{
 //lets pickup the string into the location
//wert = new Werteliste(location.search);
 //lets load our links
 $.ajax(
 {
 type: "GET",
 url: "links.xml",
 dataType: "xml",
 success: function(xml){
 //lets do some reading
  $(xml).find('provider').each(function()
  {
  provider = $(this).find("text").text();//alert(provider);
  console.log($(this).find("text").text());

  // build a vissible container for each provider with default blured content and a invisible container, which will later contain the link, next to it
  htmlStructure = htmlStructure + '<div id="'+provider+'_off_holder" style="width:100px;height:100px;display:block; background-image:url(../../Main-Theme/images/"'+provider+'"_logo.png); z-index:90;"><div id="'+provider+'"_content" style="width:100%;height:100%;"><p class="">Der Download mit der ID '+wert+' ist auf diesem Anbieter nicht vorhanden.</p></div></div><div id="'+provider+'_on_holder" style="width:100px;height:100px;display:none; background-image:url(../../Main-Theme/images/"'+provider+'"_logo.png); z-index:90;"><div id="'+provider+'"_content" style="width:100%;height:100%;">   </div></div>';
  
  //replace the no-js-place-holder into the calling document
  $(".no-js").html(htmlStructure);

  $(this).find("option").each(function() 
  {
  id = $(this).find("id").text();
  if (id == wert)
    {
     link = $(this).find("link").text();//alert(link);//alert(provider);
     console.log($(this).find("link").text());console.log(provider);
     providerliste.push(provider); //stores the provider(s) name(s) which have the ID
     linkliste.push(link); // stores the link(s) 
    }
  });
 });

for (i = 0; i < providerliste.length; i++)
 {
  // makes the default-blur-container invisible and the place-holder-container visible, for this providers, which have the ID
  $('."+providerliste[i]+"_off_holder').hide(); //alternative: document.getElementById(providerliste[i]+"_off_holder").style.display = "none";
  $('."+providerliste[i]+"_on_holder').show(); //alternative: document.getElementById(providerliste[i]+"_on_holder").style.display = "block";

  // now we create for each link a new code, which will go into the placeholder into the providers-containers. to make the container clickable, we place an transparent picture over the container
  linkStructure = linkStructure + '<a href="'+linkliste[i]+'" class=""><img src="http://forum.jswelt.de/Main-Theme/images/transparent.png" style="width:100%;height:100%;z-index:110;"></image></a>';

  //attach the links into the providers-containers
  $("#"+providerliste[i]+"_content").append(linkStructure); //alternative: $("").html(linkstructure).appendTo(providerliste[i]+'_content');
 }

},
error: function(response)
{
 alert('Error loading XML data');
}
});
});

im aufrufenden Dokument gibt es:

Code:
 <div id="no-js" class="no-js">
          <p class="no-js">Kein Javascript</p>
          </div>

was zu folgendem Ergebnis führt:



Wie sich aus dem Script ergibt, sollte das aber etwas anders aussehen, nämlich dahingehende, das eigentlich zwei Felder mit dem Link angezeigt werden sollten, statt einem Feld ohne Link.

Die alerts feuern zwar die richtigen Werte für link, aber die Darstellung haut nicht hin; habe da wahrscheinlich wieder einen Denkfehler!
Bitte nochmal helfen!

PS: Konnte das hier erst antworten, nachdem ich es erst mehrfach vergeblich versuchte und immer die Meldung erhielt, mein Beitrag müsse erst von einem Moderator geprüft werde.
Insofern kann das jetzt alles doppelt sein. Bitte nur einmal drin lassen.

- - - Aktualisiert - - -

Nachtrag:

Wenn ich
Code:
  //$('."+providerliste[i]+"_off_holder').hide(); 
document.getElementById(providerliste[i]+"_off_holder").style.display = "none";
  //$('."+providerliste[i]+"_on_holder').show(); 
document.getElementById(providerliste[i]+"_on_holder").style.display = "block";

notiere, ist die Seite übrigens ganz leer.

Das der off-holfer, nicht zu sehen ist, ist richtig, denn alle Anbieter haben ja einen Link zu der ID.

Das der on-holder aber auch nicht zu sehen ist, ist falsch - eigentlich sollte er doch durch
Code:
document.getElementById(providerliste[i]+"_on_holder").style.display = "block";

sichtbar gemacht werden, was anscheinen nicht geschieht.

Jeman eine Idee, warum?
 
Zuletzt bearbeitet:
@dbarthel: Aus irgend einem Grund müssen deine Beiträge manchmal freigeschaltet werden. Wenn du deinen Beitrag also nicht sofort siehst, poste bitte nicht ohne Ende weiter sondern warte auf die Freischaltung!
 
Zurück
Oben