Ankündigung

Einklappen
Keine Ankündigung bisher.

XML downloaden und in Array/DB schreiben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML downloaden und in Array/DB schreiben

    Hallo allerseits,

    ich beschäftige mich nun seit ein paar Monaten damit aus verschiedenen frei zugänglichen Datenquellen statistische Daten zu sammeln und in eine Datenbank zu bringen. Ich habe den Import von Json und CSV-Files mit PHP schon erfolgreich durchgeführt, scheitere und verzweifele nun aber an den Daten von Eurostat (europäische Statistikbehörde) Die Daten liegen hier leider nur umständlich in XML Files und hier liegt das Problem. Ich bekomme einfach nicht die Daten von der URL ordentlich heruntergeladen und dann auch noch ausgelesen

    Die XML Datei ist folgende:
    http://ec.europa.eu/eurostat/SDMX/di...endPeriod=2015

    Zum Download habe ich zuerst das hier versucht:

    PHP-Code:
    $url 'http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/nama_gdp_c/.MIO_EUR.B1GM.BE/?startperiod=1990&endPeriod=2015';

    function 
    get_data($url) {
        
    $ch curl_init();
        
    $timeout 5;
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT$timeout);
        
    $data curl_exec($ch);
        
    curl_close($ch);
        return 
    $data;
    }

    $returned_content get_data($url);

    print_r ($returned_content); 
    Das liefert mir ein "Access Denied". Ich nehme an das liegt an Eurostat.

    Wenn ich es so versuche:
    PHP-Code:
    $url 'http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/nama_gdp_c/.MIO_EUR.B1GM.BE/?startperiod=1990&endPeriod=2015';
    $xml simplexml_load_file($url); 
    Dann bekomme ich folgende Fehlermeldung:
    Warning: simplexml_load_file(http://ec.europa.eu/eurostat/SDMX/di...dPeriod=2015): failed to open stream: HTTP request failed! HTTP/1.1 502 Bad Gateway in /www/htdocs/w0121ba0/XMLLOAD.php on line 64

    Warning: simplexml_load_file(): I/O warning : failed to load external entity "http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/nama_gdp_c/.MIO_EUR.B1GM.BE/?startperiod=1990&endPeriod=2015" in /www/htdocs/w0121ba0/XMLLOAD.php on line 64


    Habt Ihr hierzu irgendwelche Ideen wie ich einfach dieses verfluchte File zu mir bekomme ?

    Da das nicht funktionierte habe ich versucht einen Schritt zu überspringen, und mich die letzten Tage daran versucht lokale, schon gespeicherte XML Dateien auszulesen, bin daran aber auch kläglich gescheitert. Egal wie ich es versuche den Inhalt mit echo auszugeben, es kommt immer ein leeres Objekt oder gar nichts. Könntet ihr mir hier einen Hinweis geben, wie ich bei der verlinkten XML Datei vorgehen muss? Ich brauche nur die Werte "ObsDimension und die ObsValue Werte", alles andere in der Datei interessiert mich nicht. Ich will also einfach eine Schleife haben die die Oberservations durchläuft und mir in ein Array schiebt welches ich dann problemlos in eine Datenbank bekomme.

    Einer meiner Versuche war unter anderem folgender:

    PHP-Code:
    if (file_exists('test.xml')) {
        
    $xml simplexml_load_file('test.xml');

        echo 
    $xml->GenericData->DataSet->Series;
    } else {
        exit(
    'Konnte test.xml nicht öffnen.');

    hier kommt aber nichts bei raus. Ich nehme an ich mache was bei simplexml_load_file falsch. In der Dokumentation steht ja noch etwas über class_name, options, ns und is_prefix . Ich kann damit aber als Anfänger leider nicht soviel anfangen.

    Wäre super wenn ihr mir auch hier auf die Sprünge helfen könntet!

    Vielen Dank

    VG Sebastian

  • #2
    Code:
    wget 'http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/nama_gdp_c/.MIO_EUR.B1GM.BE/?startperiod=1990&endPeriod=2015'
    funktioniert bei mir einwandfrei, wüsste also nicht wieso es mit curl nicht klappen sollte.
    das xml file sieht übrigens so aus, als ob man das mit xslt effektiv arbeiten kann.
    was willste den raus haben?

    Kommentar


    • #3
      Danke für deine schnelle Antwort!


      funktioniert bei mir einwandfrei, wüsste also nicht wieso es mit curl nicht klappen sollte.
      Ja das hat mich auch gewundert, dass ich es mit keiner Möglichkeit runter geladen bekommen habe, weil ich es im Browser völlig problemlos runterladen und anschauen kann. Ist vll. irgendwas in meinem curl_setopt falsch eingestellt?

      das xml file sieht übrigens so aus, als ob man das mit xslt effektiv arbeiten kann.
      was willste den raus haben?
      Das hört sich ja schonmal gut an!
      Ich will aus dem XML File eigentlich nur die Observations raus haben. Also das hier:
      Code:
      <generic:Obs>
      <generic:ObsDimension value="2013"/>
      <generic:ObsValue value="382692.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2012"/>
      <generic:ObsValue value="375852.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2011"/>
      <generic:ObsValue value="369258.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2010"/>
      <generic:ObsValue value="355791.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2009"/>
      <generic:ObsValue value="340669.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2008"/>
      <generic:ObsValue value="346375.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2007"/>
      <generic:ObsValue value="335815.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2006"/>
      <generic:ObsValue value="318829.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2005"/>
      <generic:ObsValue value="303435.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2004"/>
      <generic:ObsValue value="291287.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2003"/>
      <generic:ObsValue value="276157.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2002"/>
      <generic:ObsValue value="268620.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2001"/>
      <generic:ObsValue value="259803.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="2000"/>
      <generic:ObsValue value="252543.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1999"/>
      <generic:ObsValue value="238877.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1998"/>
      <generic:ObsValue value="228398.2"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1997"/>
      <generic:ObsValue value="220436.7"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1996"/>
      <generic:ObsValue value="217283.0"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1995"/>
      <generic:ObsValue value="217570.5"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1994"/>
      <generic:ObsValue value="198401.3"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1993"/>
      <generic:ObsValue value="184466.3"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1992"/>
      <generic:ObsValue value="174274.7"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1991"/>
      <generic:ObsValue value="163487.2"/>
      </generic:Obs>
      <generic:Obs>
      <generic:ObsDimension value="1990"/>
      <generic:ObsValue value="155310.6"/>
      </generic:Obs>
      </generic:Series>
      So dass dann am Ende in meinem Array beispielsweise das folgende steht:
      $array[Date]="1990"
      $array[Value]="155310.6"
      ...."1991"
      ...."163487.2"
      ....

      Die oben geannte Struktur ist immer die gleiche in den ganzen XML-Files von Eurostat, deswegen müsste ich damit dann alle Files auslesen können. Das einzige was sich ändert sind die Anzahl der Obeservations, aber das dürfte ja kein Problem darstellen.

      Kommentar


      • #4
        Zitat von SebastianB12 Beitrag anzeigen
        Warning: simplexml_load_file(http://ec.europa.eu/eurostat/SDMX/di...dPeriod=2015): failed to open stream: HTTP request failed! HTTP/1.1 502 Bad Gateway in /www/htdocs/w0121ba0/XMLLOAD.php on line 64
        Hättest mal die Fehlermeldung gelesen die kommt:

        Access Denied: Your request has been denied for security reason.

        Der folgende Code behebt das "Sicherheitsproblem":

        PHP-Code:
        $url 'http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/nama_gdp_c/.MIO_EUR.B1GM.BE/?startperiod=1990&endPeriod=2015'

        function 
        get_data($url) {
            
        $ch curl_init();
            
        curl_setopt($chCURLOPT_URL$url);
            
        curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
        curl_setopt($chCURLOPT_CONNECTTIMEOUT5);
            
        curl_setopt($chCURLOPT_USERAGENT'foobar');
            
        $data curl_exec($ch);
            
        curl_close($ch);
            return 
        $data;


        $returned_content get_data($url); 

        var_dump($returned_content); 

        Kommentar


        • #5
          Also zu CURL:
          PHP-Code:
          <HTML><HEAD>
           <
          TITLE>Web Filter</TITLE>
           </
          HEAD>
           <
          BODY>
           <
          blockquote>
           <
          TABLE border=0 cellPadding=1 width="100%">
           <
          TR><TD>
           <
          big><strong></strong></big><BR><big><strong></strong></big><BR>
           <
          FONT face="Helvetica" SIZE=3>
           <
          big>Access Denied </big><br><br>
           
          Your request has been denied for security reason.</center><BR><BR><BR><BR>
           <
          FONT face="Helvetica" SIZE=>
           If 
          you believe that this request should not be blockedplease contact <a href="mailto:snet@ec.europa.eu?subject=[Blocked URL] 46.5.203.5 / /eurostat/SDMX/diss-web/rest/data/nama_gdp_c/.MIO_EUR.B1GM.BE/">EC DIGIT SNet</a>.
           <
          BR><br>If your request is urgentplease contact also the service helpdesk (+32)2 29 58181.
           
          </FONT>
           </
          TD></TR>
           </
          TABLE>
           </
          blockquote>
           </
          FONT>
           </
          BODY></HTML
          Man wird wohl dazu aufgefordert sei CURL gefälligst so zu konfigurieren, dass es wie ein Browser aussieht

          Edit: Eine Sekunde zu Spät, aber echt schön, was solche Admins als Sicherheit sehen
          [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
          [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

          Kommentar


          • #6
            Ich hatte doch glatt vergessen, dass wget euch nen useragent string losschickt(bei mir :Wget/1.13.4 (linux-gnu)) .

            also, xslt kannste ja mal anschauen, wie du das weiterkommt, warum, ob du es brauchst oder nicht...
            Code:
            <?xml version="1.0" encoding="utf-8"?>
            <xsl:stylesheet version="1.0" 
            	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
            	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            	xmlns:xslFormatting="urn:xslFormatting"
            	xmlns:footer="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message/footer" 
            	xmlns:generic="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic" 
            	xmlns:common="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common" 
            	xmlns:message="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message" 
            	xmlns:xml="http://www.w3.org/XML/1998/namespace"	
            >
            <xsl:template match="message:GenericData">
            	<xsl:apply-templates select="message:DataSet/generic:Series/generic:Obs" />
            </xsl:template>
            
            <xsl:template match="generic:Obs">
            	<xsl:value-of select="generic:ObsDimension/@value" />
            		<xsl:text> --- </xsl:text>	
            	<xsl:value-of select="generic:ObsValue/@value" />
            </xsl:template>
            
            </xsl:stylesheet>
            ich hab denke ich zuviel namespaces declariert, soll dich mal nicht stören. Ich wollte nur zeigen wie einfach das ist, php code dazu:
            http://www.php.de/php-einsteiger/109...tml#post806816

            Kommentar


            • #7
              Ihr seit ja einfach genial! Hätte ich mal schon vorgestern gefragt....
              Habe hier mal mein Ergebnis für alle die etwas ähnliches machen wollen gepostet und unten noch ein paar Verständnisfragen, die ihr mir vielleicht bei Gelegenheit und Lust beantworten könntet.

              Meine funktionierende PHP Datei sieht jetzt so aus:

              PHP-Code:
              <?php

              $url 
              'http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/nama_gdp_c/.MIO_EUR.B1GM.BE/?startperiod=1990&endPeriod=2015';  

              function 
              get_data($url) { 
                  
              $ch curl_init(); 
                  
              curl_setopt($chCURLOPT_URL$url); 
                  
              curl_setopt($chCURLOPT_RETURNTRANSFERtrue); 
                  
              curl_setopt($chCURLOPT_CONNECTTIMEOUT5); 
                  
              curl_setopt($chCURLOPT_USERAGENT'Pommes'); 
                  
              $data curl_exec($ch); 
                  
              curl_close($ch); 
                  return 
              $data
              }  

              $returned_content get_data($url);  

              $xmlHandle simplexml_load_string($returned_content);


              $xsl = new DOMDocument();
              $xsl->load("file.xsl");
              $inputdom = new DomDocument();
              $inputdom=$xmlHandle;

              $proc = new XSLTProcessor();
              $xsl $proc->importStylesheet($xsl);
              $proc->setParameter(null"""");

              $newdom $proc->transformToDoc($inputdom);
              $output $newdom-> saveXML();
              //print $newdom-> saveXML();

              $array=explode(';' ,$output);
              var_dump ($array);
              ?>

              Und meine xsl Datei so wie moma es gepostet hat mit den unten genannten ";"-Ergänzungen.

              Noch kurz zum Verständnis, damit ich nächstes mal mehr weiß und selber weiterhelfen kann:

              Ich kann also bei CURLOPT_USERAGENT in diesem Fall alles was ich will reinschreiben, Hauptsache ich habe es benannt, damit es so aussieht als würde ich als normaler Browser zugreifen? Normalerweise würde ich da aber sowas wie "Mozilla/5.0....." reinschreiben oder?
              Irgendwie wäre ich bei der Fehlermeldung nie darauf gekommen

              Dann zu xsl:
              Sehe ich das richtig, dass ich damit ein xml dokument in ein anderes Dokument überführe, was aber die Struktur besitzt die ich zum verarbeiten brauche?

              Code:
              <xsl:stylesheet version="1.0" 
              	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
              	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              	xmlns:xslFormatting="urn:xslFormatting"
              	xmlns:footer="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message/footer" 
              	xmlns:generic="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic" 
              	xmlns:common="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common" 
              	xmlns:message="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message" 
              	xmlns:xml="http://www.w3.org/XML/1998/namespace"	
              >
              Das ist einfach aus dem alten XML Dokument übernommen und das muss ich nicht umbedingt weiter vestehen für den Anfang, nehme ich an


              Code:
              <xsl:template match="message:GenericData">
              	<xsl:apply-templates select="message:DataSet/generic:Series/generic:Obs" />
              </xsl:template>
              Wenn ich das jetzt richtig auf http://www.w3schools.com/xsl/
              nachgelesen habe setzt man hier quasi den Link zum "Root-Verzeichnis" im XML Dokument "message:GenericData". Was macht das apply-templates dann weiter? Bringt es mich quasi an die richtige Stelle im xml Dokument?

              Dann das nächste:
              Code:
              <xsl:template match="generic:Obs">
              	<xsl:value-of select="generic:ObsDimension/@value" />
              		<xsl:text>;</xsl:text>	
              	<xsl:value-of select="generic:ObsValue/@value" />
              		<xsl:text>;</xsl:text>	
              </xsl:template>
              So hier habe ich mal die Simikolons hinten und vorne eingefügt damit ich es ordentlich exploden kann, weiß zwar nicht ob das der beste Weg ist, aber es funktioniert . "value-of select" extrahiert einen Wert und fügt dem Output Stream an, wenn ich das richtig sehe.

              Kurz noch zur PHP Verarbeitung:

              Verstehe das mit dem DOMDocument noch nicht so ganz. Was ist das? In der Dokumentation steht ja
              Represents an entire HTML or XML document; serves as the root of the document tree.
              Ist es jetzt ein Dokument oder tut es nur so? Sry für die dumme Fragerei^^

              Code:
              transformToDoc($inputdom);
              Das verarbeitet quasi das alte XML Dokument in ein neues anhand des xsl Stylesheets? Und saveXML() bringt das neue XML Sheet einfach als String raus?


              Vielen Dank nochmal!

              Kommentar


              • #8
                Sehe ich das richtig, dass ich damit ein xml dokument in ein anderes Dokument überführe, was aber die Struktur besitzt die ich zum verarbeiten brauche?
                eine möglichkeit, ich generiere dann gleich output.

                Was macht das apply-templates dann weiter?
                damit gehst du an jeden child knoten, der matched und bearbeitest diesen mit dem genannten template.

                Code:
                		<xsl:text>;</xsl:text>	
                	<xsl:value-of select="generic:ObsValue/@value" />
                		<xsl:text>;</xsl:text>
                <!-- würde ich so schreiben-->
                <xsl:value-of select="concat(';', generic:ObsValue/@value, ';')" />
                musst noch irgendwie das erste und das letzte semicolon wegkriegen ?

                Ist es jetzt ein Dokument oder tut es nur so?
                ist ein phpobject.

                das neue ist kein xml
                musste output deffinieren:
                http://msdn.microsoft.com/en-us/libr...vs.110%29.aspx
                afaik.

                aber du bist aufm richtigen dampfer, und freu dich mit xslt geht mehr.
                //OT:
                es ist mal echt eine freude, dass jemand midenkt und nachliesst. scheint mir leider echt selten geworden.
                therefore +1

                Kommentar


                • #9
                  Super, danke für deine Erklärungen und deinen concat Tip. Noch eine kleine Sache die mich gerade in den Wahnsinn treibt, ebenfalls in Kombination mit xsl:

                  Ich habe das ganze nach einigem ausprobieren auch für andere Datenquellen hinbekommen, aber ich habe vor jedem Datensatz ein "Leerzeichen" was aber irgendwie kein Leerzeichen ist, sondern eher ein Absatz. Aber ich kann es mit keinem Absatz oder Leerzeichen-Tag auffinden und ersetzen.

                  Der Output sieht diesmal so aus:
                  Code:
                  12string(867) " 2013;316128839; 2012;313873685; 2011;311582564; 2010;309326295; 2009;306771529; 2008;304093966; 2007;301231207; 2006;298379912; 2005;295516599; 2004;292805298; 2003;290107933; 2002;287625193; 2001;284968955; 2000;282162411; 1999;279040000; 1998;275854000; 1997;272657000; 1996;269394000; 1995;266278000; 1994;263126000; 1993;259919000; 1992;256514000; 1991;252981000; 1990;249623000; 1989;246819000; 1988;244499000; 1987;242289000; 1986;240133000; 1985;237924000; 1984;235825000; 1983;233792000; 1982;231664000; 1981;229466000; 1980;227225000; 1979;225055000; 1978;222585000; 1977;220239000; 1976;218035000; 1975;215973000; 1974;213854000; 1973;211909000; 1972;209896000; 1971;207661000; 1970;205052000; 1969;202677000; 1968;200706000; 1967;198712000; 1966;196560000; 1965;194303000; 1964;191889000; 1963;189242000; 1962;186538000; 1961;183691000; 1960;180671000; " 2013 2013array(109) { [0]=> string(6) " 2013" [1]=> string(9) "316128839" [2]=> string(5) " 2012" [3]=> string(9) "313873685" [4]=> string(5) " 2011" [5]=> string(9) "311582564" [6]=> string(5) " 2010" [7]=> string(9) "309326295" [8]=> string(5) " 2009" [9]=> string(9) "306771529" [10]=> string(5) " 2008" [11]=> string(9) "304093966" [12]=> string(5) " 2007" [13]=> string(9) "301231207" [14]=> string(5) " 2006" [15]=> string(9) "298379912" [16]=> string(5) " 2005" [17]=> string(9) "295516599" [18]=> string(5) " 2004" [19]=> string(9) "292805298" [20]=> string(5) " 2003" [21]=> string(9) "290107933" [22]=> string(5) " 2002" [23]=> string(9) "287625193" [24]=> string(5) " 2001" [25]=> string(9) "284968955" [26]=> string(5) " 2000" [27]=> string(9) "282162411" [28]=> string(5) " 1999" [29]=> string(9) "279040000" [30]=> string(5) " 1998" [31]=> string(9) "275854000" [32]=> string(5) " 1997" [33]=> string(9) "272657000" [34]=> string(5) " 1996" [35]=> string(9) "269394000" [36]=> string(5) " 1995" [37]=> string(9) "266278000" [38]=> string(5) " 1994" [39]=> string(9) "263126000" [40]=> string(5) " 1993" [41]=> string(9) "259919000" [42]=> string(5) " 1992" [43]=> string(9) "256514000" [44]=> string(5) " 1991" [45]=> string(9) "252981000" [46]=> string(5) " 1990" [47]=> string(9) "249623000" [48]=> string(5) " 1989" [49]=> string(9) "246819000" [50]=> string(5) " 1988" [51]=> string(9) "244499000" [52]=> string(5) " 1987" [53]=> string(9) "242289000" [54]=> string(5) " 1986" [55]=> string(9) "240133000" [56]=> string(5) " 1985" [57]=> string(9) "237924000" [58]=> string(5) " 1984" [59]=> string(9) "235825000" [60]=> string(5) " 1983" [61]=> string(9) "233792000" [62]=> string(5) " 1982" [63]=> string(9) "231664000" [64]=> string(5) " 1981" [65]=> string(9) "229466000" [66]=> string(5) " 1980" [67]=> string(9) "227225000" [68]=> string(5) " 1979" [69]=> string(9) "225055000" [70]=> string(5) " 1978" [71]=> string(9) "222585000" [72]=> string(5) " 1977" [73]=> string(9) "220239000" [74]=> string(5) " 1976" [75]=> string(9) "218035000" [76]=> string(5) " 1975" [77]=> string(9) "215973000" [78]=> string(5) " 1974" [79]=> string(9) "213854000" [80]=> string(5) " 1973" [81]=> string(9) "211909000" [82]=> string(5) " 1972" [83]=> string(9) "209896000" [84]=> string(5) " 1971" [85]=> string(9) "207661000" [86]=> string(5) " 1970" [87]=> string(9) "205052000" [88]=> string(5) " 1969" [89]=> string(9) "202677000" [90]=> string(5) " 1968" [91]=> string(9) "200706000" [92]=> string(5) " 1967" [93]=> string(9) "198712000" [94]=> string(5) " 1966" [95]=> string(9) "196560000" [96]=> string(5) " 1965" [97]=> string(9) "194303000" [98]=> string(5) " 1964" [99]=> string(9) "191889000" [100]=> string(5) " 1963" [101]=> string(9) "189242000" [102]=> string(5) " 1962" [103]=> string(9) "186538000" [104]=> string(5) " 1961" [105]=> string(9) "183691000" [106]=> string(5) " 1960" [107]=> string(9) "180671000" [108]=> string(2) " " }
                  Man sieht, es ist vor jeder Jahreszahl ein Leerzeichen. Ich hatte das gleiche in dem Beispiel von dir, aber da war nur ein "'<?xml version="1.0"?>" im ersten Array sodass dort ein Leerzeichen entstand, das konnte ich ganz einfach mit
                  PHP-Code:
                  $output=str_replace('<?xml version="1.0"?>','',$output);
                  ersetzen. Diesmal ist hier aber irgendwas anderes, entsteht das durch die Transformation mit XSL?
                  Wenn man sich das ganze im Seitenquelltext anschaut sieht das so aus:
                  string(867) "

                  2013;316128839;
                  2012;313873685;
                  2011;311582564;
                  2010;309326295;
                  2009;306771529;
                  2008;304093966;
                  2007;301231207;
                  2006;298379912;
                  2005;295516599;
                  2004;292805298;
                  2003;290107933;
                  2002;287625193;
                  2001;284968955;
                  2000;282162411;
                  1999;279040000;
                  1998;275854000;
                  1997;272657000;
                  1996;269394000;
                  1995;266278000;
                  1994;263126000;
                  1993;259919000;
                  1992;256514000;
                  1991;252981000;
                  1990;249623000;
                  1989;246819000;
                  1988;244499000;
                  1987;242289000;
                  1986;240133000;
                  1985;237924000;
                  1984;235825000;
                  1983;233792000;
                  1982;231664000;
                  1981;229466000;
                  1980;227225000;
                  1979;225055000;
                  1978;222585000;
                  1977;220239000;
                  1976;218035000;
                  1975;215973000;
                  1974;213854000;
                  1973;211909000;
                  1972;209896000;
                  1971;207661000;
                  1970;205052000;
                  1969;202677000;
                  1968;200706000;
                  1967;198712000;
                  1966;196560000;
                  1965;194303000;
                  1964;191889000;
                  1963;189242000;
                  1962;186538000;
                  1961;183691000;
                  1960;180671000;

                  "


                  2013

                  2013array(109) {
                  [0]=>
                  string(6) "

                  2013"
                  [1]=>
                  string(9) "316128839"
                  [2]=>
                  string(5) "
                  2012"
                  [3]=>
                  string(9) "313873685"
                  [4]=>
                  string(5) "
                  2011"
                  [5]=>
                  string(9) "311582564"
                  [6]=>
                  string(5) "
                  2010"
                  [7]=>
                  string(9) "309326295"
                  [8]=>
                  string(5) "
                  2009"
                  [9]=>
                  string(9) "306771529"
                  [10]=>
                  string(5) "
                  2008"
                  [11]=>
                  string(9) "304093966"
                  [12]=>
                  string(5) "
                  2007"
                  [13]=>
                  string(9) "301231207"
                  [14]=>
                  string(5) "
                  2006"
                  [15]=>
                  string(9) "298379912"
                  [16]=>
                  string(5) "
                  2005"
                  [17]=>
                  string(9) "295516599"
                  [18]=>
                  string(5) "
                  2004"
                  [19]=>
                  string(9) "292805298"
                  [20]=>
                  string(5) "
                  2003"
                  [21]=>
                  string(9) "290107933"
                  [22]=>
                  string(5) "
                  2002"
                  [23]=>
                  string(9) "287625193"
                  [24]=>
                  string(5) "
                  2001"
                  [25]=>
                  string(9) "284968955"
                  [26]=>
                  string(5) "
                  2000"
                  [27]=>
                  string(9) "282162411"
                  [28]=>
                  string(5) "
                  1999"
                  [29]=>
                  string(9) "279040000"
                  [30]=>
                  string(5) "
                  1998"
                  [31]=>
                  string(9) "275854000"
                  [32]=>
                  string(5) "
                  1997"
                  [33]=>
                  string(9) "272657000"
                  [34]=>
                  string(5) "
                  1996"
                  [35]=>
                  string(9) "269394000"
                  [36]=>
                  string(5) "
                  1995"
                  [37]=>
                  string(9) "266278000"
                  [38]=>
                  string(5) "
                  1994"
                  [39]=>
                  string(9) "263126000"
                  [40]=>
                  string(5) "
                  1993"
                  [41]=>
                  string(9) "259919000"
                  [42]=>
                  string(5) "
                  1992"
                  [43]=>
                  string(9) "256514000"
                  [44]=>
                  string(5) "
                  1991"
                  [45]=>
                  string(9) "252981000"
                  [46]=>
                  string(5) "
                  1990"
                  [47]=>
                  string(9) "249623000"
                  [48]=>
                  string(5) "
                  1989"
                  [49]=>
                  string(9) "246819000"
                  [50]=>
                  string(5) "
                  1988"
                  [51]=>
                  string(9) "244499000"
                  [52]=>
                  string(5) "
                  1987"
                  [53]=>
                  string(9) "242289000"
                  [54]=>
                  string(5) "
                  1986"
                  [55]=>
                  string(9) "240133000"
                  [56]=>
                  string(5) "
                  1985"
                  [57]=>
                  string(9) "237924000"
                  [58]=>
                  string(5) "
                  1984"
                  [59]=>
                  string(9) "235825000"
                  [60]=>
                  string(5) "
                  1983"
                  [61]=>
                  string(9) "233792000"
                  [62]=>
                  string(5) "
                  1982"
                  [63]=>
                  string(9) "231664000"
                  [64]=>
                  string(5) "
                  1981"
                  [65]=>
                  string(9) "229466000"
                  [66]=>
                  string(5) "
                  1980"
                  [67]=>
                  string(9) "227225000"
                  [68]=>
                  string(5) "
                  1979"
                  [69]=>
                  string(9) "225055000"
                  [70]=>
                  string(5) "
                  1978"
                  [71]=>
                  string(9) "222585000"
                  [72]=>
                  string(5) "
                  1977"
                  [73]=>
                  string(9) "220239000"
                  [74]=>
                  string(5) "
                  1976"
                  [75]=>
                  string(9) "218035000"
                  [76]=>
                  string(5) "
                  1975"
                  [77]=>
                  string(9) "215973000"
                  [78]=>
                  string(5) "
                  1974"
                  [79]=>
                  string(9) "213854000"
                  [80]=>
                  string(5) "
                  1973"
                  [81]=>
                  string(9) "211909000"
                  [82]=>
                  string(5) "
                  1972"
                  [83]=>
                  string(9) "209896000"
                  [84]=>
                  string(5) "
                  1971"
                  [85]=>
                  string(9) "207661000"
                  [86]=>
                  string(5) "
                  1970"
                  [87]=>
                  string(9) "205052000"
                  [88]=>
                  string(5) "
                  1969"
                  [89]=>
                  string(9) "202677000"
                  [90]=>
                  string(5) "
                  1968"
                  [91]=>
                  string(9) "200706000"
                  [92]=>
                  string(5) "
                  1967"
                  [93]=>
                  string(9) "198712000"
                  [94]=>
                  string(5) "
                  1966"
                  [95]=>
                  string(9) "196560000"
                  [96]=>
                  string(5) "
                  1965"
                  [97]=>
                  string(9) "194303000"
                  [98]=>
                  string(5) "
                  1964"
                  [99]=>
                  string(9) "191889000"
                  [100]=>
                  string(5) "
                  1963"
                  [101]=>
                  string(9) "189242000"
                  [102]=>
                  string(5) "
                  1962"
                  [103]=>
                  string(9) "186538000"
                  [104]=>
                  string(5) "
                  1961"
                  [105]=>
                  string(9) "183691000"
                  [106]=>
                  string(5) "
                  1960"
                  [107]=>
                  string(9) "180671000"
                  [108]=>
                  string(2) "

                  "
                  }
                  Ihr seht in meinem PHP Code, dass ich schon durch gegoogle so einiges probiert habe, das Ding da raus zu bekommen, aber anscheinend kommt man da mit HTML-Tag Ersetzungen nicht weiter .
                  PHP-Code:
                  <?php



                                      
                  function get_data($url) { 
                                          
                  $ch curl_init(); 
                                          
                  curl_setopt($chCURLOPT_URL$url); 
                                          
                  curl_setopt($chCURLOPT_RETURNTRANSFERtrue); 
                                          
                  curl_setopt($chCURLOPT_CONNECTTIMEOUT5); 
                                          
                  curl_setopt($chCURLOPT_USERAGENT'Pommes'); 
                                          
                  $data curl_exec($ch); 
                                          
                  curl_close($ch); 
                                          return 
                  $data
                                      }  


                                      
                  $url="http://api.worldbank.org/countries/USA/indicators/SP.POP.TOTL?format=xml&per_page=100";

                                      
                  $returned_content get_data($url);  

                                      
                                      

                                      
                  $xmlHandle simplexml_load_string($returned_content);


                                      
                  $xsl = new DOMDocument();
                                      
                  $xsl->load("Worldbank.xsl");
                                      
                  $inputdom = new DomDocument();
                                      
                  $inputdom=$xmlHandle;

                                      
                  $proc = new XSLTProcessor();
                                      
                  $xsl $proc->importStylesheet($xsl);
                                      
                  $proc->setParameter(null,"","");

                                      
                  $newdom $proc->transformToDoc($inputdom);
                                      
                                      
                  $output $newdom->saveXML();
                                      
                  $output=str_replace('<?xml version="1.0"?>','',$output);
                                      
                  $output=str_replace(' ','',$output);
                                      
                  $output=str_replace('\n','',$output);
                                      
                  $output=str_replace('\br','',$output);
                                      
                  $output=str_replace(' ','',$output);
                                      
                  $output=str_replace('<br>','',$output);
                                      
                  $output=str_replace('<br />','',$output);
                                      
                  $output=str_replace('</td>','',$output);
                                      
                  $output=str_replace('<br />','',$output);
                                      
                  $output=str_replace('br /','',$output);
                                      
                                      
                  //print $newdom-> saveXML();
                                      
                  var_dump ($output);
                                      
                  $array=explode(';',$output);
                                      echo 
                  $array[0];
                                      
                  $Test$array[0];
                                      
                  trim($Test);
                                      echo 
                  $Test;
                                      
                                              
                  var_dump ($array);




                  ?>
                  Das XSL File:
                  Code:
                  <?xml version="1.0" encoding="utf-8"?>
                  <xsl:stylesheet version="1.0" 
                  	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                  	xmlns:xslFormatting="urn:xslFormatting"
                  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                  	xmlns:xml="http://www.w3.org/XML/1998/namespace"
                  	xmlns:wb="http://www.worldbank.org"
                  >
                  <!-- <xsl:template match="wb:data">
                  	<xsl:apply-templates select="wb:data" />
                  </xsl:template> -->
                  
                  <xsl:template match="wb:data/wb:data">
                  	<xsl:value-of select="wb:date"/>		
                  	<xsl:value-of select="concat(';',wb:value,';')" />
                  		
                  </xsl:template>
                  
                  </xsl:stylesheet>
                  Übrigens sieht man hier auch, dass ich diesmal das "apply-template" weggelassen habe, weil es damit nicht funktionierte. Bin noch am recherchieren woran das liegt, dachte eigentlich nach dem letzten Beispiel, dass das notwendig ist.

                  Habt ihr irgendwelche Ideen, wie ich diesen Leer/New-Line/Absatz Zeichen oder was auch immer da weg bekomme? (Achja "trim" habe ich natürlich auch schon ausprobiert). Danke euch!

                  Kommentar


                  • #10
                    sorry gerade keine zeit, aber sucht du :
                    Zitat von http://stackoverflow.com/questions/1468984/xslt-remove-whitespace-from-template
                    To remove white-space from a value, you could use the normalize-space() XSLT function:

                    <xsl:value-of select="normalize-space(data)" />
                    und da war noch:
                    Zitat von http://php.net/manual/de/xsltprocessor.transformtoxml.php
                    XSLTProcessor::transformToXML — Transformierung zu einem XML-String
                    sowie:
                    Zitat von http://php.net/manual/de/xsltprocessor.transformtoxml.php#94861
                    To prevent your xsl file from automatically prepending
                    <?xml version="1.0"?>
                    whilst keeping the output as xml, which is preferable for a validated strict xhtml file, rather specify output as
                    <xslutput method="xml" omit-xml-declaration="yes" />
                    achja es heisst apply-templates was ja auch im code richtig ist.

                    Kommentar


                    • #11
                      Dafür das du keine Zeit hattest, hast du mir ziemlich weitergeholfen Habe mir dann hieraus noch was gesucht: http://stackoverflow.com/questions/1...on-not-working

                      Und mit deinem zusammen kam dann das raus, was jetzt auch funktioniert, aber eher ein Ergebnis von trial and error war wenn ich ehrlich bin (Ich glaube nämlich, dass das ich mit dem text() jetzt alle Leerzeichen killt^^?)

                      Code:
                      <?xml version="1.0" encoding="utf-8"?>
                      <xsl:stylesheet version="1.0" 
                      	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                      	xmlns:xslFormatting="urn:xslFormatting"
                      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                      	xmlns:xml="http://www.w3.org/XML/1998/namespace"
                      	xmlns:wb="http://www.worldbank.org"
                      >
                      <!-- <xsl:template match="wb:data">
                      	<xsl:apply-templates select="wb:data" />
                      </xsl:template> -->
                      
                      <xsl:output method="xml" omit-xml-declaration="yes" />
                          <xsl:template match="text()">
                              <xsl:value-of select='normalize-space()'/>
                          </xsl:template>
                      
                      <xsl:template match="wb:data/wb:data">
                      	<xsl:value-of select="wb:date" />	
                      	<xsl:value-of select="concat(';',wb:value,';')" />
                      		
                      </xsl:template>
                      
                      </xsl:stylesheet>
                      Zudem habe ich auf das transformToXML umgestellt. Ich muss mir aber echt noch die Zeit finden, dass mal nachzuvollziehen. Ist da w3schools die beste Adresse um das mal zu lernen, oder heißt es mal wieder alles mögliche aus dem Internet zusammen zu suchen?

                      Kommentar


                      • #12
                        http://docstore.mik.ua/orelly/xml/xslt/index.htm
                        steht ein haufen drin.
                        Code:
                        <xsl:strip-space elements="*" />
                        <xsl:template match="wb:data/wb:data">
                        	
                        	<xsl:value-of select="normalize-space(concat(wb:date, ';',wb:value,';'))" />
                        		
                        </xsl:template>
                        so auf die schnelle, geht das nicht?

                        Kommentar


                        • #13
                          So gehts auch , sieht sauberer aus als meine Lösung. Hoffentlich bin ich auch irgendwann mal so schnell mit den Lösungen^^

                          Nur falls du Zeit dafür findest:
                          Code:
                          <xsl:strip-space elements="*" />
                          Das wird ja so erklärt:
                          The <xsl:strip-space> element is used to define the elements for which white space should be removed.
                          Da du da "*" reingeschreiben hast, nehme ich an dass damit alle Element ausgewählt werden. Was macht das "normalize-space" dann noch? Und was ist der Unterschied zu meiner Lösung:
                          Code:
                          <xsl:template match="text()">
                                  <xsl:value-of select='normalize-space()'/>
                              </xsl:template>
                          Danke für die Quelle, die führe ich mir bei Zeiten mal zu Gemüte.

                          Kommentar

                          Lädt...
                          X