Avatar billede sjh Nybegynder
26. juni 2006 - 16:51 Der er 23 kommentarer og
1 løsning

Hjælp til xml data

Er der en xml-haj da kan hjælpe mig med at få disse vadier ud: (date, number, dayname, text1, text2, icon)

Jeg har prøvet at lege lidt med xml_parser_create() men kan ikke få det til at virke helt som jeg gerne vil..

<?php
  $file = "test.xml";

  function startElement($parser, $name, $attrs) {
 
  }

  function endElement($parser, $name){
 
  }

  $xml_parser = xml_parser_create();
  xml_set_element_handler($xml_parser, "startElement", "endElement");
  if (!($fp = fopen($file, "r"))) {
    // error
  }

  while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
      // error
    }
  }

  xml_parser_free($xml_parser);
?>

<!-- test.xml -->
<?xml version="1.0"?>
<mydata produced="2006-06-24 00:00:00">
  <day date="2006-06-25" number="0" dayname="s&#xF8;ndag">
    <text1>Tekst 0 1</text1>
    <text2>Tekst 0 2</text2>
    <icons>
      <icon>icon_name_1</icon>
    </icons>
  </day>
  <day date="2006-06-26" number="1" dayname="mandag">
    <text1>Tekst 1 1</text1>
    <text2>Tekst 1 2</text2>
    <icons>
      <icon>icon_name_2</icon>
    </icons>
  </day>
  <day date="2006-06-27" number="2" dayname="tirsdag">
    <text1>Tekst 2 1</text1>
    <text2>Tekst 2 2</text2>
    <icons>
      <icon>icon_name_3</icon>
    </icons>
  </day>
  <day date="2006-06-28" number="3" dayname="onsdag">
    <text1>Tekst 3 1</text1>
    <text2>Tekst 3 2</text2>
    <icons>
      <icon>icon_name_4</icon>
    </icons>
  </day>
  <day date="2006-06-29" number="4" dayname="torsdag">
    <text1>Tekst 4 1</text1>
    <text2>Tekst 4 2</text2>
    <icons>
      <icon>icon_name_5</icon>
    </icons>
  </day>
</mydata>
<!-- test.xml -->
Avatar billede jakobdo Ekspert
26. juni 2006 - 19:00 #1
Jeg skal gerne gøre et forsøg senere, hvis ingen har meldt en løsning.
Om jeg har XML-haj, langtfra, men noget slamkode som kan give dig den ønskede virkning, det skulle jeg nok kunne klare! :o)
Avatar billede nielle Nybegynder
26. juni 2006 - 19:38 #2
Mit bud:

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

$file = "test.xml";
$fp = fopen($file, "r") or die("Kunne ikke åbne filen.");

while ($data = fread($fp, 4096))
{
    xml_parse($xml_parser, $data, feof($fp)) or
        die(sprintf("XML error: %s at line %d", 
            xml_error_string(xml_get_error_code($xml_parser)), 
            xml_get_current_line_number($xml_parser)));
}

fclose($fp);

xml_parser_free($xml_parser);

// -----

function startElement($parser, $tagName, $attrs)
{
    global $insideDay, $tag;
    if ($insideDay)
    {
        $tag = $tagName;
    }
    elseif ($tagName == "DAY")
    {
        echo "Date: " . $attrs["DATE"] . <br>;
        echo "Number: " . $attrs["NUMBER"] . <br>;
        echo "Dayname: " . $attrs["DAYNAME"] . <br>;

        $insideDay = true;
    }
}

function endElement($parser, $tagName)
{
    global $insideDay, $tag;
    if ($tagName == "DAY")
    {
        $tag = "";
        $insideDay = false;
    }
}

function characterData($parser, $data)
{
    global $insideDay, $tag;
    if ($insideDay)
    {
        switch ($tag)
        {
            "TEXT1" :
                echo "Text1: " . $data . "<br>";
                break;
            "TEXT2" :
                echo "Text2: " . $data . "<br>";
                break;
        }
    }
}
Avatar billede nielle Nybegynder
26. juni 2006 - 19:41 #3
Hov, havde ikke lige set at jakobdo havde nået at melde sig på banen mens jeg sad og kodede. :^)
Avatar billede sjh Nybegynder
26. juni 2006 - 20:41 #4
hmmm det virker næsten.. får bare text1 og  text2 ud flere gange..

Date: 2006-06-25
Number: 0
Dayname: søndag
Text1: Tekst 0 1
Text1:
Text1:
Text2: Tekst 0 2
Text2:
Text2:

Date: 2006-06-26
Number: 1
Dayname: mandag
Text1: Tekst 1 1
Text1:
Text1:
Text2: Tekst 1 2
Text2:
Text2:

osv...
Avatar billede sjh Nybegynder
26. juni 2006 - 20:54 #5
har fået det til at virke ved at gørre sådan..

function characterData($parser, $data)
{
    global $insideDay, $tag;
    if (trim($data) > 0 && $insideDay) //---- if ($insideDay)
    {
        switch ($tag)
        {
            "TEXT1" :
                echo "Text1: " . $data . "<br>";
                break;
            "TEXT2" :
                echo "Text2: " . $data . "<br>";
                break;
        }
    }
}


men hvis jakobdo kan komme med en bedre måde at gøre det på.. så venter jeg da en dags tid ;)
Avatar billede sjh Nybegynder
26. juni 2006 - 21:00 #6
når ja.. der var også lige ICONS/ICON hvor kommer de ud..??

<icons>
  <icon>icon_name_1</icon>
</icons>
Avatar billede fangel Nybegynder
26. juni 2006 - 21:11 #7
Hvis du på serveren har PHP5 installeret, så brug SimpleXML eller DOM funktionerne istedet.. SAX-parsere (som dem du bruger) er til at blive langhåret af... ;)

-fangel
Avatar billede sjh Nybegynder
26. juni 2006 - 21:23 #8
Jeg har PHP 4.3.4.4 på serveren..
Avatar billede nielle Nybegynder
26. juni 2006 - 21:32 #9
Icon får du med med:

function characterData($parser, $data)
{
    global $insideDay, $tag;
    if (trim($data) != "" && $insideDay) //---- if ($insideDay)
    {
        switch ($tag)
        {
            "TEXT1" :
                echo "Text1: " . $data . "<br>";
                break;
            "TEXT2" :
                echo "Text2: " . $data . "<br>";
                break;
            "ICON" :
                echo "Icon: " . $data . "<br>";
                break;
        }
    }
}
Avatar billede sjh Nybegynder
26. juni 2006 - 21:38 #10
hæ hæ nielle det trode jeg også men den duer ikke.. da den er $insideDay er false kommer den aldrig derind.. :D

men har fået den til at virke med...


  function startElement($parser, $tagName, $attrs) {
    global $tag;
    $tag = $tagName;
    if ($tag == "DAYFORECAST") {
      echo "Date: " . $attrs["DATE"] . "<br>\n";
      echo "Number: " . $attrs["NUMBER"] . "<br>\n";
      echo "Dayname: " . $attrs["DAYNAME"] . "<br>\n";
    }
  }

  function endElement($parser, $tagName) {
  //-- Tom..
  }

  function characterData($parser, $data) {
    global $tag;
    if (trim($data)) {
      if ($tag == "TEXT1") {
        echo "Text1: ".$data."<br>\n";
      } elseif ($tag == "TEXT2") {
        echo "Text1: ".$data."<br>\n";
      } elseif ($tag == "ICON") {
        echo "Icon: ".$data."<br>\n";
      }
    }
  }
Avatar billede nielle Nybegynder
26. juni 2006 - 21:40 #11
$insideDay bør absolut ikke være false for icon.
Avatar billede nielle Nybegynder
26. juni 2006 - 21:43 #12
Hvor kommer "DAYFORECAST" ind i sammenhængen? Den optræder ikke i den XML-kode du har vist.
Avatar billede jakobdo Ekspert
26. juni 2006 - 21:45 #13
Nielle: Jeg skrev bare jeg ville kigge på en løsning, så det skulle ikke opfattes som en reservation! :o) Du giver jo også kvalificeret hjælp, så kunne jeg jo netop bruge min tid på andre ting, som f.eks. at spille fodbold i det gode vejr!
Avatar billede sjh Nybegynder
26. juni 2006 - 21:46 #14
sorry det var mig der lavede lidt om på navnet.. "DAG"
Avatar billede nielle Nybegynder
26. juni 2006 - 21:48 #15
26/06-2006 21:45:06> Fair nok ;^)
Avatar billede nielle Nybegynder
26. juni 2006 - 21:49 #16
Jeg ville mene at dette skulle virke (inkl. icon):

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

$file = "test.xml";
$fp = fopen($file, "r") or die("Kunne ikke åbne filen.");

while ($data = fread($fp, 4096))
{
    xml_parse($xml_parser, $data, feof($fp)) or
        die(sprintf("XML error: %s at line %d", 
            xml_error_string(xml_get_error_code($xml_parser)), 
            xml_get_current_line_number($xml_parser)));
}

fclose($fp);

xml_parser_free($xml_parser);

// -----

function startElement($parser, $tagName, $attrs)
{
    global $insideDay, $tag;
    if ($insideDay)
    {
        $tag = $tagName;
    }
    elseif ($tagName == "DAY")
    {
        echo "Date: " . $attrs["DATE"] . <br>;
        echo "Number: " . $attrs["NUMBER"] . <br>;
        echo "Dayname: " . $attrs["DAYNAME"] . <br>;

        $insideDay = true;
    }
}

function endElement($parser, $tagName)
{
    global $insideDay, $tag;
    if ($tagName == "DAY")
    {
        $tag = "";
        $insideDay = false;
    }
}

function characterData($parser, $data)
{
    global $insideDay, $tag;
    if ($insideDay && trim($data) != "")
    {
        switch ($tag)
        {
            "TEXT1" :
                echo "Text1: " . $data . "<br>";
                break;
            "TEXT2" :
                echo "Text2: " . $data . "<br>";
                break;
            "ICON" :
                echo "Icon: " . $data . "<br>";
                break;
        }
    }
}
Avatar billede sjh Nybegynder
26. juni 2006 - 21:58 #17
Ja nu virker det da også.. nå man ellers får rettet alle de sjove fejl du laver :D

der mangler "case" ved TEXT1,TEXT2,ICON
og så ved php ikke hvad . <br>; er (Date, Number, Dayname) :D
Avatar billede sjh Nybegynder
26. juni 2006 - 22:00 #18
dog kan jeg ikke lige se hvorfor du bruger $insideDay det kan jo laves uden..

nielle du må også godt smide et svar..
Avatar billede nielle Nybegynder
26. juni 2006 - 22:07 #19
$insideDay bruges for at sikre at der ikke vil komme matches på f.eks. ICOB som ligger unden for en day-tag:

<day date="2006-06-29" number="4" dayname="torsdag">
    ...
</day>
<icon>Den vil vi ikke have med</icon>

Godt nok er der ikke sådan nogen i eksemplet, så det gåt godt denne gang.

Ups, den med de manglende case havde jeg ikke lige opdaget... Og <br> uden "-tegn... Sorry!

... og et svar :^)
Avatar billede nielle Nybegynder
26. juni 2006 - 22:08 #20
Og trykfejl strøes også ud med rund hånd :^)
Avatar billede sjh Nybegynder
26. juni 2006 - 22:18 #21
Ha ha.. okææ.. så ved jeg også det :D

mange tak for jeres hjælp :-)
Avatar billede jakobdo Ekspert
26. juni 2006 - 22:24 #22
Det må være Nielle du mener! :o)
Nielle er sgu en guttermand.
Avatar billede nielle Nybegynder
26. juni 2006 - 22:26 #23
Ahhhhhh, det er altid rart at få stivet sit ego af ;^)
Avatar billede sjh Nybegynder
26. juni 2006 - 22:38 #24
Jo det var Nielle da lavede koden + fik point.. men derfor kan man jo også godt takke de andre som har skrævet her.. ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester