Avatar billede nicoolai Nybegynder
09. februar 2008 - 15:54 Der er 17 kommentarer

Vise ekstern XML

Hej Eksperter

Jeg skal implementere et nyhedsfeed fra http://www.haandbold.com/til_din_hjemmeside.php på en webside.
Websiden er bygget op i OpenCms og det bruger JSP.

Nyhedsfeedet er i xml format.

Hvordan henter jeg indholdet ud af filen fra haandbold.com og viser det på websiden?

På forhånd tak
/nicoolai
Avatar billede arne_v Ekspert
09. februar 2008 - 16:04 #1
Det er der mange forskellige måder at gøre på.

Men jeg ville gå efter en model:

- OpenCMS mapper request for en given URL til noget Java kode evt. embedded i en
  JSP side (jeg er ikke stiv i den del, men jeg regner med at det er nemt)

- den Java kode:
    - henter feed med (Http)URLConnection
    - transformerer XML til HTML med XSLT
    - outputter HTML

- hvis det skal være en high volume løsning så skal Java koden have en cache
  således at XML kun hentes maksimalt hver N'te sekund (cache HTML så
  su også sparer XSLT transformeringen)
Avatar billede arne_v Ekspert
09. februar 2008 - 16:05 #2
Du kan også lave noget client side.

Men min generelle erfaring er at server side giver langt færre problemer.
Avatar billede nicoolai Nybegynder
09. februar 2008 - 16:37 #3
Ja, tænker noget med java da det umiddelbart lyder næmmest.
Jeg har aldrig rigtig beskæftiget mig med xml før, så det ville være utrolig fedt hvis du ville komme med et eksempel på hvordan jeg trækker nyhederne ud af den eksterne xml-fil.
Avatar billede arne_v Ekspert
09. februar 2008 - 18:08 #4
Jeg kan da godt proeve og bixe et lille eksempel som transformerer XML på den URL til noget HTML.
Avatar billede nicoolai Nybegynder
09. februar 2008 - 18:15 #5
Det vil jeg blive meget taknemmelig for.
Mange tak.
Avatar billede arne_v Ekspert
09. februar 2008 - 18:57 #6
package february;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Xml2Html {
    private static String xsl = "<?xml version='1.0'?>" +
                                "<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>" +
                                "<xsl:template match='/'>" +
                                "<ul>" +
                                "<xsl:apply-templates/>" +
                                "</ul>" +
                                "</xsl:template>" +
                                "<xsl:template match='nyhed'>" +
                                "<li><a>" +
                                "<xsl:attribute name='href'><xsl:value-of select='link'/></xsl:attribute>" +
                                "<xsl:value-of select='overskrift'/>" +
                                "</a></li>" +
                                "</xsl:template>" +
                                "</xsl:stylesheet>";
    public static String transform(String xml) throws Exception {
        StringWriter sw = new StringWriter();
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer(new StreamSource(new StringReader(xsl)));
        t.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
        t.setOutputProperty(OutputKeys.METHOD, "html");
        t.transform(new StreamSource(new StringReader(xml)), new StreamResult(sw));
        return sw.toString();
    }
    public static String load(String urlstr) throws Exception {
        URL url = new URL(urlstr);
        StringBuffer sb = new StringBuffer("");
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String line;
        while((line = in.readLine()) != null) {
            sb.append(line);
            sb.append('\n');
        }
        return sb.toString();
    }
    public static void main(String[] args) throws Exception {
        String xml = load("http://www.haandbold.com/xml/xml_nyheder.xml");
        System.out.println(xml);
        String html = transform(xml);
        System.out.println(html);
    }
}
Avatar billede arne_v Ekspert
09. februar 2008 - 18:58 #7
Output:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<nyheder><nyhed id="11031"><datotid>2008-02-09 17:55:38</datotid><overskrift>Tele2 Ligaen: Tiltrængte point til Viborg</overskrift><link>http://www.haandbold.com/nyheder.php?id=11031</link></nyhed><nyhed id="11030"><datotid>2008-02-09 16:06:23</datotid><overskrift>Champions League: Slagelse tabte til Hypo</overskrift><link>http://www.haandbold.com/nyheder.php?id=11030</link></nyhed><nyhed id="11029"><datotid>2008-02-09 12:59:09</datotid><overskrift>Kampreferat: Ajax Heroes vs Odder Håndbold</overskrift><link>http://www.haandbold.com/nyheder.php?id=11029</link></nyhed><nyhed id="11028"><datotid>2008-02-09 07:07:00</datotid><overskrift>Sidste udkald for Skanderborg Håndbold</overskrift><link>http://www.haandbold.com/nyheder.php?id=11028</link></nyhed><nyhed id="11027"><datotid>2008-02-09 07:00:23</datotid><overskrift>EHF Cuppen: Nederlag til Lemgo</overskrift><link>http://www.haandbold.com/nyheder.php?id=11027</link></nyhed><nyhed id="11026"><datotid>2008-02-09 06:56:17</datotid><overskrift>1. division: Lemvig vandt lokalopgør</overskrift><link>http://www.haandbold.com/nyheder.php?id=11026</link></nyhed><nyhed id="11025"><datotid>2008-02-09 06:50:31</datotid><overskrift>FOX må undvære islandsk fløj i 6 uger</overskrift><link>http://www.haandbold.com/nyheder.php?id=11025</link></nyhed><nyhed id="11024"><datotid>2008-02-09 06:32:38</datotid><overskrift>Jesper Holmris tager over i England</overskrift><link>http://www.haandbold.com/nyheder.php?id=11024</link></nyhed><nyhed id="11022"><datotid>2008-02-08 16:43:33</datotid><overskrift>Nordea Cup: Trænerteam møder hinanden</overskrift><link>http://www.haandbold.com/nyheder.php?id=11022</link></nyhed><nyhed id="11021"><datotid>2008-02-08 16:34:28</datotid><overskrift>Bojana Popovic undgår karantæne</overskrift><link>http://www.haandbold.com/nyheder.php?id=11021</link></nyhed></nyheder>

<ul>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11031">Tele2 Ligaen: Tiltr&aelig;ngte point til Viborg</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11030">Champions League: Slagelse tabte til Hypo</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11029">Kampreferat: Ajax Heroes vs Odder H&aring;ndbold</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11028">Sidste udkald for Skanderborg H&aring;ndbold</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11027">EHF Cuppen: Nederlag til Lemgo</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11026">1. division: Lemvig vandt lokalopg&oslash;r</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11025">FOX m&aring; undv&aelig;re islandsk fl&oslash;j i 6 uger</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11024">Jesper Holmris tager over i England</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11022">Nordea Cup: Tr&aelig;nerteam m&oslash;der hinanden</a>
</li>
<li>
<a href="http://www.haandbold.com/nyheder.php?id=11021">Bojana Popovic undg&aring;r karant&aelig;ne</a>
</li>
</ul>
Avatar billede arne_v Ekspert
09. februar 2008 - 18:59 #8
Du skal sikkert have en anden form for HTML. Koden skal også have noget bedre
exception håndtering. Og static er nok ikke god.

Men det skulle gerne give dig en masse ideer til hvad man kan.
Avatar billede nicoolai Nybegynder
09. februar 2008 - 19:10 #9
Mange tak skal du have.
Hvorfor tror du at static ikke er god?
Avatar billede arne_v Ekspert
09. februar 2008 - 19:38 #10
Det er bare et generelt princip.
Avatar billede arne_v Ekspert
09. februar 2008 - 21:09 #11
Jeg smider et svar.
Avatar billede nicoolai Nybegynder
14. februar 2008 - 18:10 #12
Hej Arne

Du må undskylde at jeg først svarer nu.
Lige et spørgsmål.
Er det muligt at loade en ekstern xml ind i javascript?

/nicoolai
Avatar billede arne_v Ekspert
14. februar 2008 - 18:38 #13
Ja.

Man kan sagtens lave transformeringen client side, hvis man hellere vil det.
Avatar billede nicoolai Nybegynder
14. februar 2008 - 18:45 #14
Hvordan gøres dette?
Avatar billede nicoolai Nybegynder
14. februar 2008 - 18:47 #15
Jeg er ikke så java og javascript kyndig. Jeg kan dog godt finde rundt i javascript. Bare sitet var bygget op i et php-cms system. Så havde det været nemt at implementere xml'en (i hvert fald for mig :-))
Avatar billede arne_v Ekspert
14. februar 2008 - 19:00 #16
JavaScript er ikke min staerke side.

Men her er noget IE java script:

<xml id="demoxml" src="XmlServlet"/>
<xml id="defaultss" src="defaultss.xsl"/>
<iframe id="result"></iframe>
<form>
<input type="button" value="Vis XML" onClick="showxml()"/>
</form>
<script language="JavaScript">
function showxml() {
    var xmldoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
    xmldoc.async = false;
    xmldoc.load(demoxml);
    var xsldoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
    xsldoc.async = false;
    xsldoc.load(defaultss);
    document.all.result.contentWindow.document.write(xmldoc.transformNode(xsldoc));
}
</script>
Avatar billede arne_v Ekspert
08. juni 2008 - 17:47 #17
all set ?
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
Kurser inden for grundlæggende programmering

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