Avatar billede luctatic Nybegynder
14. oktober 2004 - 10:50 Der er 10 kommentarer og
1 løsning

XLM giver ulogisk fejl

Ok, jeg tilgår en .rss på nettet for at bruge den til at vise et par nyheder på en JSP side jeg har smækket sammen for sjov. Det har virket fint i et par år, men pludseligt får jeg en fejl på den. Jeg arbejder lidt med det, og beslutter så at lave det om til ren java for at se om det er webserveren der brokker sig - det er det dog ikke. Tag et kig på den kodestump jeg har brugt til at teste det efter.


**KODE OFF**
/*
* Author: JvA
* Created: 14. oktober 2004 10:19:02
* Modified: 14. oktober 2004 10:19:02
*/

import org.jdom.Document;
import org.jdom.Namespace;
import org.jdom.Element;
import org.jdom.Attribute;
import org.jdom.input.SAXBuilder;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import java.util.List;
class Test
{
    public static void main(String [] args)
    {
        try
        {
            SAXBuilder builder = new SAXBuilder();
            List l;
            Document doc = builder.build(new URL("http://www.camelotherald.com/xml/news.rss"));
            Element root = doc.getRootElement();
           
            List list = root.getChildren();
            Element ele = (Element)list.get(2);
            System.out.println(ele.getName());
           
            ele = root.getChild("ele.getName()");
           
            System.out.println(ele);
        }
        catch(Exception e)
        {
            System.out.print(e);
        }
    }
   
}

**KODE OFF**


Som I ser tilgår jeg som sagt en .rss og henter så root-elementet. Så vælger jeg at hente element nummer to og printer navnet - som helst skulle være (og er) "item".

Nu kommer det sjove så - hvis jeg siger at jeg gerne vil have det første child-element med navnet "item" som findes under root-elementet, så får jeg null. Vi har lige konkluderet at det findes, og at navnet er "item", men når jeg søger efter det sker der ingenting.

Jeg viser lige API'en til den jdom jeg benytter.

Element - getChild(java.lang.String name)
This returns the first child element within this element with the given local name and belonging to no namespace.

Element - getChild(java.lang.String name, Namespace ns)
This returns the first child element within this element with the given local name and belonging to the given namespace.


Og ja - jeg har prøvet med både getChild("item") og getChild("item",ns); uden held. Adressen til hele JDOM api'en er http://www.jdom.org/docs/apidocs/index.html.
Avatar billede arne_v Ekspert
14. oktober 2004 - 10:58 #1
Kunnne vi få exception text on eksempel på input fil ?
Avatar billede luctatic Nybegynder
14. oktober 2004 - 11:06 #2
Output når jeg kører det er:
Starting application Test
Command line: "C:\j2sdk1.4.2_04\jre\bin\java.exe" Test
item
null
Interactive Session Ended
Avatar billede luctatic Nybegynder
14. oktober 2004 - 11:07 #3
Der kommer ikke nogen expection - den ryger fint hele vejen igennem.
Avatar billede luctatic Nybegynder
14. oktober 2004 - 11:07 #4
Exception - sorry.
Avatar billede arne_v Ekspert
14. oktober 2004 - 11:11 #5
Der er vel ikke noget overraskend ei at:

ele = root.getChild("ele.getName()");
System.out.println(ele);

udskriver null ?
Avatar billede arne_v Ekspert
14. oktober 2004 - 11:12 #6
ele = root.getChild("ele.getName()");

skal vel være

ele = root.getChild(ele.getName());
Avatar billede luctatic Nybegynder
14. oktober 2004 - 11:17 #7
Ja ok - fik lavet forkert copy'n'paste. Der står faktisk ele=root.getChild(ele.getName()); men jeg kunne også skrive ele=root.getChild("item"); hvis jeg ville (da ele.getName() jo netop er sat til at være "item") uden held. Samme printout.
Avatar billede luctatic Nybegynder
14. oktober 2004 - 11:19 #8
Btw - da jeg sagde 'ns' mente jeg det Namespace jeg prøvede at bruge.

Namespace ns = Namespace.getNamespace(""+root.getNamespace());
Avatar billede luctatic Nybegynder
14. oktober 2004 - 11:32 #9
Prøvede også:
Namespace ns = Namespace.getNamespace(root.getNamespace().getPrefix(), root.getNamespace().getURI());

uden held.
Avatar billede luctatic Nybegynder
14. oktober 2004 - 12:18 #10
Har arbejdet lidt med det. Nu ser den sådan ud:

/*
* Author: JvA
* Created: 14. oktober 2004 10:19:02
* Modified: 14. oktober 2004 10:19:02
*/

import org.jdom.Document;
import org.jdom.Namespace;
import org.jdom.Element;
import org.jdom.Attribute;
import org.jdom.input.SAXBuilder;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import java.util.List;
class Test
{
    public static void main(String [] args)
    {
        try
        {
            SAXBuilder builder = new SAXBuilder();
            List l;
            Document doc = builder.build(new URL("http://www.camelotherald.com/xml/news.rss"));
            Element root = doc.getRootElement();
           
            Namespace ns = Namespace.getNamespace(root.getNamespace().getPrefix(), root.getNamespace().getURI());
           
            List list = root.getChildren();
            Element ele = (Element)list.get(2);
            System.out.println("Element 1: "+ele);
           
            ele = root.getChild(ele.getName());
            System.out.println("Namespace: "+ns);
            System.out.println("Element: "+ele);
        }
        catch(Exception e)
        {
            System.out.print(e);
        }
    }
   
}



Og her kommer printout:
Starting application Test
Command line: "C:\j2sdk1.4.2_04\jre\bin\java.exe" Test
Element 1: [Element: <item [Namespace: http://purl.org/rss/1.0/]/>]
Namespace: [Namespace: prefix "rdf" is mapped to URI "http://www.w3.org/1999/02/22-rdf-syntax-ns#"]
Element: null

Interactive Session Ended
Avatar billede luctatic Nybegynder
14. oktober 2004 - 12:23 #11
Ah got it - af en eller anden grund så er namespace på root og namespace på elementet to forskellige ting - så hvis jeg tilføjer http://purl.org/rss/1.0/ som namespace til getChild(ele.getName(),ns) istedet for det namespace der lå på root så fungerer det.

De må have ændret på deres egen .rss feed. Jeg takker for din tid.
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