simpleXML Werte von Attributen auslesen

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

  • simpleXML Werte von Attributen auslesen

    hi!

    Ich habe folgendes Problem und hoffe ihr könnt mir helfen..

    <?xml version="1.0" encoding="UTF-8"?>
    <svg width="1024pt" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="1100pt" >
    <g transform="translate(1047.25, 19.5) rotate(-270)" style="fill:#ffffff; fill-rule:evenodd; stroke:#000000; stroke-width:0pt; stroke-linecap:butt; stroke-linejoin:miter; stroke-dasharray:none;" >
    <path d="M0 0 C0 0 533 0 533 0 C533 0 533 1047 533 1047 C533 1047 0 1047 0 1047 C0 1047 0 0 0 0 Z" />
    </g>
    <g transform="translate(969.25, 46.5) rotate(-270)" style="fill:#00cd00; fill-rule:evenodd; stroke:#000000; stroke-width:0.0100049pt; stroke-linecap:butt; stroke-linejoin:miter; stroke-dasharray:none;" >
    <path d="M0 0 C0 0 470 0 470 0 C470 0 470 100 470 100 C470 100 0 100 0 100 C0 100 0 0 0 0 Z" />
    </g>
    ...
    Dies ist ein ausschnitt aus einer datei die ich auslesen möchte..
    ich habe bisher nicht viel mit xml zu tun gehabt aber ich soll im praktikum jetzt versuchen die attribute in eine mysql datenbank zu übertragen.

    bisher habe ich herrausgefunden wie man mit simpleXML werte zwischen tags (z.b. <g>hier</g>) ausliest aber in meiner datei muss ich attribute (z.b. <g transform="translate(969.25, 46.5) rotate(-270)"></g>) auslesen, da es eine svg datei ist und dort nur gezeichnet wird.

    ich brauche nur die werte von den attributen "transform", "style" und "d".

    Leider habe ich bis jetzt einfach nichts dazu gefunden, wie ich die attribute auslesen kann.

    ich hoffe mir kann jemand helfen.

    Danke schon mal im Vorraus!

  • #2
    Re: simpleXML Werte von Attributen auslesen

    Original geschrieben von absinth1986
    Leider habe ich bis jetzt einfach nichts dazu gefunden, wie ich die attribute auslesen kann.
    Definiere Auslesen.

    Willst du von einem bestimmten Element die Attribute ermitteln? Dann halte ich "hab nix gefunden" für schlechten Scherz oder Frechheit - RTFM!

    Oder willst du nach Elementen suchen, die bestimmte Attribute mit bestimmten Werten haben? Dann entweder die Elemente iterativ/rekursiv durchlaufen und selber "nachschauen", oder mit XPATH vertraut machen.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      ich möchte die werte zu transform="wert", style="wert" und d="wert" mit php auslesen und in eine mysql datenbank übertragen.

      in allen tutorials die ich bis jetzt gefunden habe wird entweder nur auf zum beispielt das: <author>Name des Authors</author> eingegangen oder ich muss die quelldatei bearbeiten und dies reinschreiben "$xmlstr = <<<XML XML;".
      das kann ich aber bei über 100 dateien nicht..

      ich such schon seit ein paar tagen nach einem tutorial das mir helfen kann..

      so wie ich es brauche konnt ich es in keinem tutorial finden und das soll kein scherz sein.

      EDIT: Ok nach 2,5 Tagen Suche hab ich eben etwas gefunden dass mir weitergeholfen hat. Ich hoffe ihr lasst den Thread offen, dann kann ich immer weiter ergänzen, falls jemand mal das gleiche problem hat.
      Zuletzt geändert von absinth1986; 07.02.2007, 10:11.

      Kommentar


      • #4
        ich bin schon mal ein stück weiter aber hab wieder nen hänger..
        ich kanns mir ehrlich nicht erklären warum es so nicht funktioniert.

        Quelldatei (siehe oben)

        PHP Script:
        PHP-Code:
        <?php
        $file 
        "../Park10.svg"//Pfad zur auszulesenden Datei
        $park_id 1//Nummer des Parks

        $db mysql_connect('localhost''user''passwd') OR die(mysql_error()); //Verbindung zu MySQL herstellen
              
        mysql_select_db(friedhof_data$db) OR die(mysql_error()); //Verbindung zur Datenbank herstellen

        $query "CREATE TABLE park_" $park_id "(
                    id INT NOT NULL,
                    transform VARCHAR(99999) NOT NULL,
                    style VARCHAR(99999) NOT NULL,
                    d VARCHAR(99999) NOT NULL,
                    PRIMARY KEY(id))"
        //Tabelle mit der Parknummer $park_id wird erstellt
        $result mysql_query($query);

        $xml simplexml_load_file($file); //auszulesende Datei wird geladen
        ?>

        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>XML Reader v0.1</title>
        </head>
        <body>

        <?php
        $i 
        0//Laufvariable wird auf 0 gesetzt
        foreach ($xml->as $node) { //1. Schleife wird gestartet

            
        $transform[$i] = $node["transform"]; //Wert für Attribut "transform" wird ausgelesen
            
        $style[$i] = $node["style"]; //Wert für Attribut "style" wird ausgelesen
            
        echo $transform[$i];
            echo 
        $style[$i];

            foreach (
        $xml->g->path as $node2) { //2. Schleife wird gestartet

                
        $d[$i] = $node2["d"]; //Wert für Attribut "d" wird ausgelesen
                
        echo $d[$i];
            } 
        //2. Schleife wird beendet
            
            
        mysql_query("INSERT INTO park_" $park_id " VALUES('$i', '$transform[$i]', '$style[$i]', '$d[$i]')"$db); //Werte werden in die Datenbank übertragen

        $i++; //Laufvariable wird automatisch um 1 erhöht
        //1. Schleife wird beendet
        ?>

        </body>
        </html>
        ich gebe die werte zur kontrolle (nur für mich) mit echo zwischendurch aus und dort ist mir aufgefallen das der wert von dem attribut "d" immer der gleiche ist, also immer der erste "M0 0 C0 0 533 0 533 0 C533 0 533 1047 533 1047 C533 1047 0 1047 0 1047 C0 1047 0 0 0 0 Z"

        da zu jeder zeile in der datenbank eine "id", "transform", "style" und "d" gehört wäre es schon nich schlecht wenn es in der gleichen schleife mitläuft.

        wieso wird es da nicht auch durchlaufen?
        Zuletzt geändert von absinth1986; 08.02.2007, 08:55.

        Kommentar


        • #5
          PHP-Code:
          foreach ($xml->as $node) { //1. Schleife wird gestartet 
          OK, für jedes g wird jetzt ein Schleifendurchlauf gemacht, in dem dir der Inhalt dieses g in $node zur Verfügung steht.
          PHP-Code:
              foreach ($xml->g->path as $node2) { //2. Schleife wird gestartet 
          Welche g sind das hier?

          (Wenn nicht mehrere path pro g vorkommen können, ist eine Schleife hier sowieso unsinnig.)
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            also ich schreib dir den aufbau nochmal ohne schnick schnack hier hin..

            <svg>
            <g>
            <path>
            </path>
            </g>

            <g>
            <path>
            </path>
            </g>

            ...
            </svg>

            also in jedem <g> kommt nur ein mal <path> vor.
            dann kann ich doch das 2. foreach weglassen ne? aber wie bekomme ich dann das attribut "d" jedesmal ausgelesen?

            Kommentar


            • #7
              Original geschrieben von absinth1986
              aber wie bekomme ich dann das attribut "d" jedesmal ausgelesen?
              In dem du über das aktuelle g darauf zugreifst, und nicht über das erste.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                ok das hört sich ja logisch an nur hab ich gedacht wenn oben in dem foreach "$xml->g as $node" steht, dass ich dann nur auf die attribute von <g> zugreifen kann.

                also ich wüsste jetzt nicht wie ich in dieser schleife auf ein attribut von <path> zugreifen soll.

                kannst du mir nicht einen denkanstoß geben

                Kommentar


                • #9
                  Original geschrieben von absinth1986
                  ok das hört sich ja logisch an nur hab ich gedacht wenn oben in dem foreach "$xml->g as $node" steht, dass ich dann nur auf die attribute von <g> zugreifen kann.
                  Du möchtest mit diesem Foreach mehrere g durchlaufen.
                  Damit du innerhalb dieser Schleife weisst, welches g gerade "aktuell" ist, benutzt du as $node - auf das jeweils aktuelle g hast du also im Schleifenkörper über $node Zugriff.
                  also ich wüsste jetzt nicht wie ich in dieser schleife auf ein attribut von <path> zugreifen soll.
                  Du willst auf den path zugreifen, der unterhalb des in diesem Schleifendurchlauf "aktuellen" g liegt.
                  kannst du mir nicht einen denkanstoß geben
                  Anstoss genug?
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    PHP-Code:
                    foreach ($xml->as $node) { //Schleife wird gestartet

                        
                    $transform[$i] = $node["transform"]; //Wert für Attribut "transform" wird ausgelesen
                        
                    $style[$i] = $node["style"]; //Wert für Attribut "style" wird ausgelesen
                        
                    $d[$i] = $node->path["d"]; //Wert für Attribut "d" wird ausgelesen
                    $i++;

                    ich hab es jetzt so gemacht, keine ahnung ob das eine elegante lösung ist aber es funktioniert
                    das problem war ich wusste nicht dass man es auch so schreiben kann "$node->path["d"]"

                    EDIT:
                    so jetzt komm ich wieder bei einem problem an
                    die quelldatei ist zur mitte hin dann plötzlich anders aufgebaut..
                    heißt nicht mehr
                    <g>
                    <path>
                    </g>
                    sondern
                    <g>
                    <text>
                    <tspan></tspan>
                    </text>
                    </g>
                    das könnte man doch höchstens mit if-else lösen oder?
                    also das script rödelt ja jedes <g> ab und das man in dieser schleife jedes mal abfragt..
                    PHP-Code:
                    if ($style[$i] = "") { .. }
                    else { 
                    weiterlaufen lassen 
                    oder gibt es mit xml dort eine einfachere lösung?
                    Zuletzt geändert von absinth1986; 08.02.2007, 13:01.

                    Kommentar

                    Lädt...
                    X