Avatar billede barf Nybegynder
18. december 2004 - 14:16 Der er 11 kommentarer og
1 løsning

læs xml og udskriv det i listform

Jeg vil gerne læse en xml-fil af formatet:

<?xml version="1.0" encoding="UTF-8"?>
<menu>
    <drop navn="menupunkt 1">
        <sub navn="submenu 1.1" url="hej.php" />
        <sub navn="submenu 1.2" url="hej.php" />
    </drop>
    <drop navn="menupunkt 2">
        <sub navn="submenu 2.1" url="hej.php" />
        <sub navn="submenu 2.2" url="hej.php" />
        <sub navn="submenu 2.3" url="hej.php" />
    </drop>
</menu>

og derefter udskrive det så det bliver til:

<ul>
    <li>menupunkt
        <ul>
            <li><a href="sub11.php">submenu 1.1</a></li>
            <li><a href="sub12.php">submenu 1.2</a></li>
        </ul>
    </li>
    <li>menupunkt 2
        <ul>
            <li><a href="sub21.php">submenu 2.1</a></li>
            <li><a href="sub22.php">submenu 2.2</a></li>
            <li><a href="sub23.php">submenu 2.3</a></li>
        </ul>
    </li>
</ul>


, men hvordan gør jeg lige det?
Avatar billede barf Nybegynder
18. december 2004 - 14:17 #1
hovs links i xml og listen skal selvfølgelig passe sammen :-)
Avatar billede boomshanka Nybegynder
18. december 2004 - 14:20 #2
Du bruger XSLT til at transformere din xml over til et andet format. En udemærket tutorial kan du finde på http://www.w3schools.com/xsl/default.asp
Avatar billede boomshanka Nybegynder
18. december 2004 - 14:46 #3
men jeg ville nok anbefale nedenstående format istedet:
<menu>
    <drop>
        <dropnavn>menupunkt 1</dropnavn>
        <sub>
            <navn>submenu 1.1</navn>
            <url>hej.php</url>
        </sub>
        <sub>
            <navn>submenu 1.2</navn>
            <url>hej.php</url>
        </sub>
    </drop>
    <drop>
        <dropnavn>menupunkt 2</dropnavn>
        <sub>
            <navn>submenu 2.1</navn>
            <url>hej.php</url>
        </sub>
        <sub>
            <navn>submenu 2.2</navn>
            <url>hej.php</url>
        </sub>
        <sub>
            <navn>submenu 2.3</navn>
            <url>hej.php</url>
        </sub>
    </drop>
</menu>

det er nemmere at hente en værdi på den måde istedet for en attribut
Avatar billede barf Nybegynder
18. december 2004 - 15:39 #4
Kan man ikke gøre det via PHP uden brug af XSLT?
Avatar billede boomshanka Nybegynder
18. december 2004 - 15:53 #5
Jeg kan slet ikke forestille mig PHP skulle kunne transformere et XML-dokument uden brug af XSLT. Alt andet ville tage alt for lang tid at kode i PHP, og ville sandsynligvis ikke være særlig fleksibelt hvis du senere ville ændre i XML-filen
Avatar billede boomshanka Nybegynder
18. december 2004 - 16:17 #6
Hvis du ændre din XML-fil til:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="...\test.xsl"?>
<menu>
    <drop>
        <dropnavn>menupunkt 1</dropnavn>
        <sub>
            <subnavn>submenu 1.1</subnavn>
            <url>hej.php</url>
        </sub>
        <sub>
            <subnavn>submenu 1.2</subnavn>
            <url>hej.php</url>
        </sub>
    </drop>
    <drop>
        <dropnavn>menupunkt 2</dropnavn>
        <sub>
            <subnavn>submenu 2.1</subnavn>
            <url>hej.php</url>
        </sub>
        <sub>
            <subnavn>submenu 2.2</subnavn>
            <url>hej.php</url>
        </sub>
        <sub>
            <subnavn>submenu 2.3</subnavn>
            <url>hej.php</url>
        </sub>
    </drop>
</menu>

...og opretter en XSLT-fil (test.xsl) med følgende indhold:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates select="menu/drop"/>
    </xsl:template>
   
    <xsl:template match="drop">
        <ul>
            <li><xsl:value-of select="dropnavn"/><xsl:apply-templates select="sub"/></li>
        </ul>
    </xsl:template>
   
    <xsl:template match="sub">
        <ul>
            <li><a>
                    <xsl:attribute name="href"><xsl:value-of select="url"/></xsl:attribute>
                    <xsl:value-of select="subnavn"/>
                </a>
            </li>
        </ul>
    </xsl:template>
</xsl:stylesheet>

...så burde du kunne se resultatet i IE ved at åbne din XML-fil
Avatar billede boomshanka Nybegynder
18. december 2004 - 16:19 #7
Med mindre du mener det skal skrives ude præcis som det står - altså i HTML-kode?
Avatar billede barf Nybegynder
18. december 2004 - 16:30 #8
Det er lidt det jeg gør :-)

Jeg kan lige forklare hvad det skal bruges til:
Jeg har en flash menu, som får sin struktur fra en xml-fil. Flash og søgemaskiner er ikke glade for hinanden, derfor vil jeg vise en html-menu til søgemaskine bots. Den html-menu skal genereres ud fra den samme xml-fil, som flash menuen benytter.
Avatar billede boomshanka Nybegynder
18. december 2004 - 16:37 #9
aha, så er jeg med. Hvis strukturen i din HTML-menu ikke er noget issue, så prøv med den her XSLT-fil istedet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates select="menu/drop"/>
    </xsl:template>
   
    <xsl:template match="drop">
        &lt;ul&gt;
            &lt;li&gt;<xsl:value-of select="dropnavn"/><xsl:apply-templates select="sub"/>&lt;/li&gt;
        &lt;/ul&gt;
    </xsl:template>
   
    <xsl:template match="sub">
        &lt;ul&gt;
            &lt;li&gt;&lt;a href="<xsl:value-of select="url"/>"&gt;<xsl:value-of select="subnavn"/>&lt;/a&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    </xsl:template>
</xsl:stylesheet>

jeg mener hvis der ikke er nogen som skal se på din html-genereret menu så kan du bruge ovenstående
Avatar billede barf Nybegynder
19. december 2004 - 15:02 #10
boomshanka det virker jo fint, men jeg er ikke sikker på hvordan en søgebot vil reagere på koden.

Jeg har i mellemtiden fundet ud af at gøre det i PHP:

<?php

$str = "";

function startElement($parser, $name, $attrs) {
    global $str;
    if($name == "MENU"){
        $str .= "<ul>\n";       
    }else if($name == "DROP"){
        $str .= "<li>".$attrs['NAVN']."\n<ul>\n";
    }else if($name == "SUB"){
        $str .= "<li><a href=\"".$attrs['URL']."\">".$attrs['NAVN'];
    }
}

function endElement($parser, $name) {
    global $str;
    if($name == "MENU"){
        $str .= "</ul>\n";
    }else if($name == "DROP"){
        $str .= "</ul>\n</li>\n";
    }else if($name == "SUB"){
        $str .= "</a></li>\n";
    }
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
$fp = fopen("menu.xml","r") or die("Fejl ved læsningen af xml data.");

while ($data = fread($fp, 4096)){
  xml_parse($xml_parser, $data, feof($fp)) or die(sprintf("XML fejl: %s ved 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);

echo $str;

?>


Jeg vil gerne give dig point for din xsl løsning, så vil du lægge et svar?
Avatar billede boomshanka Nybegynder
19. december 2004 - 20:30 #11
Det er i orden - så kan jeg måske lære at kende PHP bedre :-)
Avatar billede barf Nybegynder
19. december 2004 - 20:43 #12
Tak for hjælpen!
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