Announcement

Collapse
No announcement yet.

XML Daten richtig zuordnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML Daten richtig zuordnen

    Hallo Leute,
    ich bin neu hier und habe da mal einige Fragen zum Thema XML.

    Normalerweise Programiere ich nur im C++ und VB Bereich, doch diesmal muss ich mich mit XML ein wenig auseinander setzen.

    Mein Problem ist, dass ich eine Seite für einen Auto Chip tuner machen möchte, wo der User bestimmte Daten abrufen kann.

    Dafür habe ich zum einen die HTML Datei mit dem Code für die Seite, sowie mehrere XML Dateien. Die eine Datei heißt hersteller.xml und die zweite heißt dann wie der entsprechende Hersteller heißt. In der Hersteller Datei stehen alle Fahrzeughersteller mit einem Verweis auf die Datendatei mit den Modellen von dem Hersteller.
    Wenn der User jetzt zB. den Hersteller Audi in der Hersteller Liste wählt, dann wird die Datei Audi.xml ausgelesen und die Modelle in die Liste Modelle geschrieben. Das Problem was ich nun aber habe, das alle Motoren in der Motoren Liste eingetragen werden, egal zu welchen Model sie gehören. Sprich es werden alle Motoren von dem Hersteller angezeigt und nicht nur die von dem Model.

    Hier habe ich mal für euch den Code von der html datei:

    Code:
    <html>
     
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <title>Fahrzeugmarke</title>
     
     
    <script language='JavaScript'><!--
     
    var ersterArray = new Array();
    var zweiterArray = new Array();
    var vierterArray = new Array();
    var strDataFile;
    var Selected;
    var Selected2;
    var Selected3;
     
    function neu() {
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.open("GET","http://www.m-mtuning.de/Joomla/xml/hersteller.xml",false);
    xmlhttp.send();
    xmlDoc=xmlhttp.responseXML;
     
    var marke = xmlDoc.getElementsByTagName("name");
    var links = xmlDoc.getElementsByTagName("datei");
     
    for ( var i = 0; i < 44; ++i )
    {
        ersterArray[i] = marke[i].childNodes[0].nodeValue.toString();
        zweiterArray[i] = links[i].childNodes[0].nodeValue.toString();
    }
    }
     
    function SelectHash() {
    	var Selected = document.testform.Hashref1.options;
    	var Num = 0;
    	while (Num < 44) {
    		var NewArray = new Array(44);
    		NewArray[Num] = (ersterArray[Num]);
                    document.testform.Hashref1.options[Num] = new Option(NewArray[Num],NewArray[Num]);
    		Num++;
    	}
    }
     
    function SelectHash2() {
    Selected2 = document.testform.Hashref1.options[document.testform.Hashref1.options.selectedIndex].value;
     
     
    var dummy;
    var strSource = ".xml";
    var strData = "";
     
    dummy = (Selected2.replace(" ",""));
    strData = (dummy.toLowerCase());
    strDataFile = strData + strSource;
    alert(strDataFile);
    neu2();
    }
     
    function neu2() {
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
     
    var pfad = "http://www.m-mtuning.de/Joomla/xml/" + strDataFile;
     
    xmlhttp.open("GET",pfad,false);
    xmlhttp.send();
    xmlDoc=xmlhttp.responseXML;
     
    var dritterArray = new Array();
    var modell = xmlDoc.getElementsByTagName("modell");
    var motor = xmlDoc.getElementsByTagName("motor");
    var daten = xmlDoc.getElementsByTagName("daten");
     
    for (var i = 0; i < modell.length; i++)
    {
         dritterArray[i] = modell[i].childNodes[0].nodeValue.toString();
    //	 vierterArray[i] = motor[i].childNodes[0].nodeValue.toString(); //
         document.testform.Hashref2.options[i] = new Option(dritterArray[i]);
    }
         document.testform.Hashref2.length = dritterArray.length;
    	 alert(dritterArray[0]);
    }
    function SelectHash3(){
     
    Selected3 = document.getElementById("Hashref2").options[document.getElementById("Hashref2").selectedIndex].index;
     
    alert(Selected3);
     
    }
    //-->
    </script>
    </head>
    <form action="" name="Formular">
    	<input onclick="neu();SelectHash()" type="button" value="  Chiptuning Abfrage  " />&nbsp;</form>
    <form action="somecgi" method="post" name="testform">
    	<br />
    	<br />
    	<table width="500">
    		<tbody>
    			<tr>
    				<td width="25%">
    					Fahrzeugmarke:<br />
    					<select name="Hashref1" onchange="SelectHash2()" style="width: 150px"></select></td>
    				<td width="25%">
    					Fahrzeugmodell:<br />
    					<select name="Hashref2" id="Hashref2" onchange="SelectHash3()" style="width: 150px"></select></td>
    				<td width="25%">
    					Motorvariante:<br />
    					<select name="Hashref3" onchange="SelectHash3()" style="width: 150px"></select></td>
    			</tr>
    		</tbody>
    	</table>
    </form>
    </body>
     
    </html>

    Die Hersteller Datei sieht wie folgt aus:

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <marke_name>
      <marke>
        <name>Alfa Romeo</name>
    	<datei>alfaromeo.xml</datei>
      </marke>
      <marke>
        <name>Audi</name>
    	<datei>audi.xml</datei>
      </marke>
      <marke>
        <name>BMW</name>
    	<datei>bmw.xml</datei>
      </marke>
    </marke_name>
    Da hier ja eine beschränkung auf 10000 Zeichen ist, findet Ihr die entsprechende Audi XML unter dem Pfad: http://m-mtuning.de/Joomla/xml/audi.xml

    Um den Fehler auch Bildlich zu sehen, könnt Ihr auch unter http://m-mtuning.de/Joomla/index.php?option=com_content&view=article&id=46&It emid=28 schauen.

    Wenn ich wie gesagt AUDI auswähle und dann AUDI 80, dann zeigt er mir auch die Motoren an, welche es eigentlich nicht für dieses Model gibt.
    Zuletzt editiert von BW-Catcher; 10.03.2011, 23:13. Reason: Erweiterung

  • #2
    Wenn ich http://m-mtuning.de/Joomla/xml/audi.xml mit Firefox lade, erhalte ich folgende Fehlermeldung:
    Code:
    XML Parsing Error: mismatched tag. Expected: </modell>.
    Location: http://m-mtuning.de/Joomla/xml/audi.xml
    Line Number 141, Column 3:</model>
    So ist es also schlecht möglich, die Struktur des Dokumentes zu erkennen. Korrigiere also bitte die Datei, so dass sie den XML-Syntaxregeln entspricht.
    Ansonsten versuche es mit
    Code:
    var modelle = xmlDoc.getElementsByTagName("modell");
    for (var i = 0, l = modelle.length; i < l; i++) {
      var motoren = modelle[i].getElementsByTagName("motor");
      ...
    }
    damit liest man dann nur die "motor"-Elemente, die in einem bestimmten "modell"-Element enthalten sind.

    Comment


    • #3
      In dem XML-File hast du andauernd "modell" und "model" vermischt.

      Des Weiteren dürfte das mehr ein Javascriptproblem sein....
      Christian

      Comment


      • #4
        Crosspost
        http://www.netzwelt.de/forum/webentw...-zuordnen.html
        Christian

        Comment


        • #5
          Originally posted by Martin Honnen View Post
          Wenn ich http://m-mtuning.de/Joomla/xml/audi.xml mit Firefox lade, erhalte ich folgende Fehlermeldung:
          Code:
          XML Parsing Error: mismatched tag. Expected: </modell>.
          Location: http://m-mtuning.de/Joomla/xml/audi.xml
          Line Number 141, Column 3:</model>
          So ist es also schlecht möglich, die Struktur des Dokumentes zu erkennen. Korrigiere also bitte die Datei, so dass sie den XML-Syntaxregeln entspricht.
          Ansonsten versuche es mit
          Code:
          var modelle = xmlDoc.getElementsByTagName("modell");
          for (var i = 0, l = modelle.length; i < l; i++) {
            var motoren = modelle[i].getElementsByTagName("motor");
            ...
          }
          damit liest man dann nur die "motor"-Elemente, die in einem bestimmten "modell"-Element enthalten sind.


          Die Audi Datei habe ich entsprechend richtige gestellt. Doch bekomme ich den Zugriff auf den einzelnen Knotenpunkt nicht hin. Wenn ich also Audi oder Bmw auswähle, dann bekomme ich alle Modelle und zu allen Modellen, auch alle Motoren die es vom hersteller gibt.

          Comment


          • #6
            Code:
            var modelle = xmlDoc.getElementsByTagName("modell");
            for (var i = 0, l = modelle.length; i < l; i++) {
              var modell = modelle[i];
              var motoren = modell.getElementsByTagName("motor");
              var daten = modell.getElementsByTagName("daten");
              for (var j = 0, l2 = motoren.length; j < l2; j++) {
                var motor = motoren[j];
                var datenElement = daten[j];
                
              }
            }
            sollte aber bei der Struktur funktionieren, um die verschiedenen "modell"-Elemente in der äußeren Schleife zu durchlaufen und dann in der inneren auf die zugehörigen "motor" und "daten"-Elemente zuzugreifen.

            Comment


            • #7
              Hi Martin,
              danke für deine Hilfe schon mal. Da ich wie ja schon erwähnt, im XML Bereich neuling bin, versteh ich die Umsetzung gerade nicht. Ich habe es auf der Webseite mal geändert, doch jetzt bekomme ich zwar die Hersteller angezeigt, aber nicht mehr die Modelle und die Motoren.

              hier nochmal der Code von der Seite, vieleicht kannst du an dem Code ja meinen Fehler erkennen.

              Danke im Vorraus.

              Code:
              <script language='JavaScript'><!--
              
              var ersterArray = new Array();
              var zweiterArray = new Array();
              var vierterArray = new Array();
              var strDataFile;
              var Selected;
              var Selected2;
              
              function neu() {
              if (window.XMLHttpRequest)
                {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
                }
              else
                {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
              xmlhttp.open("GET","xml/hersteller.xml",false);
              xmlhttp.send();
              xmlDoc=xmlhttp.responseXML;
              
              var marke = xmlDoc.getElementsByTagName("name");
              var links = xmlDoc.getElementsByTagName("datei");
              
              for ( var i = 0; i < 44; ++i )
              {
                  ersterArray[i] = marke[i].childNodes[0].nodeValue.toString();
                  zweiterArray[i] = links[i].childNodes[0].nodeValue.toString();
              }
              }
              
              function SelectHash() {
                  var Selected = document.testform.Hashref1.options;
                  var Num = 0;
                  while (Num < 44) {
                      var NewArray = new Array(44);
                      NewArray[Num] = (ersterArray[Num]);
                              document.testform.Hashref1.options[Num] = new Option(NewArray[Num],NewArray[Num]);
                      Num++;
                  }
              }
              
              function SelectHash2() {
              Selected2 = document.testform.Hashref1.options[document.testform.Hashref1.options.selectedIndex].value;
              
              var dummy;
              var strSource = ".xml";
              var strData = "";
              
              dummy = (Selected2.replace(" ",""));
              strData = (dummy.toLowerCase());
              strDataFile = strData + strSource;
              alert(strDataFile);
              neu2();
              }
              
              function neu2() {
              if (window.XMLHttpRequest)
                {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
                }
              else
                {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
              var pfad = "xml/" + strDataFile;
              
              xmlhttp.open("GET",pfad,false);
              xmlhttp.send();
              xmlDoc=xmlhttp.responseXML;
              
              var modelle = xmlDoc.getElementsByTagName("modell");
              
              for (var i = 0, l = modelle.length; i < l; i++) {
              
                var modell = modelle[i];
                var motoren = modell.getElementsByTagName("motor");
                var daten = modell.getElementsByTagName("daten");
              
                for (var j = 0, l2 = motoren.length; j < l2; j++) {
                  
                  var datenElement = daten[j];
                  document.testform.Hashref2.options[i] = new Option(modelle[i]);
                  document.testform.Hashref3.options[i] = new Option(motoren[i]);
                }
                }
                 alert(datenElement);
              }
              
              function SelectHash3()
              {
              }
              
              
              //-->
              </script>
              <form action="" name="Formular">
                  <input onclick="neu();SelectHash()" type="button" value="  Chiptuning Abfrage  " />&nbsp;</form>
              <form action="somecgi" method="post" name="testform">
                  <br />
                  <br />
                  <table width="500">
                      <tbody>
                          <tr>
                              <td width="25%">
                                  Fahrzeugmarke:<br />
                                  <select name="Hashref1" onchange="SelectHash2()" style="width: 150px"></select></td>
                              <td width="25%">
                                  Fahrzeugmodell:<br />
                                  <select name="Hashref2" onchange="SelectHash3()" style="width: 150px"></select></td>
                              <td width="25%">
                                  Motorvariante:<br />
                                  <select name="Hashref3" onchange="SelectHash3()" style="width: 150px"></select></td>
                              <td width="25%">
                                  <br />
                                  <input name="submit" type="submit" value=" Anzeigen " /></td>
                          </tr>
                      </tbody>
                  </table>
              </form>



              die einzelnen Listboxen heißen bei Mir "ersterArray", "zweiterArray" und "dritterArray"

              Gruß
              Rico

              Comment


              • #8
                Was genau soll in den HTML-select-Elementen dargestellt werden? Es macht keinen Sinn, new Option(domElement) aufzurufen, da wirst du erst auf den Inhalt eines Elementknoten zugreifen müssen:
                Code:
                new Option(modell.firstChild.nodeValue)
                new Option(motoren[j].firstChild.nodeValue)

                Comment


                • #9
                  Also ich habe je die drei ListBoxen, In der ersten werden ja die hersteller geladen. Wenn ich dort Audi auswähle, dann sollen mir in der zweiten die Modelle angezeigt werden. Wenn ich dann in der Dritten den Motor ausgewählt habe und auf anzeige gehe, dann will ich mir zu technischen Daten zu dem Motor anzeigen lassen.

                  Mein derzeitiges Problem ist, dass ich das XML/JAVA Script vorgehen noch nicht ganz verstanden habe (wenn ich überhaupt schon was verstanden habe )

                  Für mich ist XML komplettes neuland, denn normalerweise Programiere ich in VB, VBA oder C+.

                  Meine Ich denke mal, bis zu dem Punkt wo mir die hersteller angezeigt werden, werde ich auch richtig sein, doch jetzt verstehe ich nicht wie ich die weiteren Knotenpunkte auslesen kann.

                  An welche Stelle im Quelltext muss ich die entsprechenden Punkte ändern?

                  Comment


                  • #10
                    Ich habe bereits gezeigt, wie man Elemente in einem anderen Element findet, also wie man, wenn man ein "modell"-Element hat, dann die darin enthaltenen "motor" oder "daten"-Elemente findet. Dafür habe ich den Code auch gepostet. Wenn du das W3C DOM zum Auslesen von XML-Daten benutzen willst, aber nicht verstehst, dann lese eventuell erst mal http://www.w3.org/TR/1998/REC-DOM-Le...-one-core.html. Da werden die verschiedenen Knotentypen und ihre Eigenschaften und Methoden definiert.
                    Du willst die ausgelesenen Daten dann in deinem HTML-Dokument in select-Elemente einbauen, das hat dann aber nichts mehr mit XML zu tun, sondern ist eher ein Problem von client-seitigem Javascript und dem HTML-DOM. Und du hast bis jetzt auch nur allgemeine Angaben wie "will ich mir zu technischen Daten zu dem Motor anzeigen" gemacht, da jedes "daten"-Element diverse Kindelemente wie "motorentyp", "motorenart", "hubraum" usw. hat, ist mir noch nicht klar, was genau denn in einem option-Element des dritten select-Elementes angezeigt werden soll.
                    Was die XML DOM API angeht, so greift man per
                    Code:
                    datenElement.getElementsByTagName("hubraum")[0]
                    z.b. auf das erste "hubraum"-Kindelement zu. Den Inhalt kann man wie bei anderen Elementen auch per firstChild.nodeValue auslesen.

                    Comment

                    Working...
                    X