Avatar billede mik28 Seniormester
13. november 2007 - 14:17 Der er 22 kommentarer og
1 løsning

XPATH problem når nodeværdi ikke findes

Hej Eksperter,

Jeg har en for løkke som udskriver værdier på denne vis.

for(){
tag.item(i).getNodeValue()
}

Det virker også fint lige indtil tag.item(i).getNodeValue() ikke findes. Så bliver der smidt en nullpointerexception. Hvordan undgår jeg det?
Avatar billede ladyhawke Novice
13. november 2007 - 14:29 #1
den nemme løsning: undersøg om item(i) er null inden du forsøger at læse den
Avatar billede mik28 Seniormester
13. november 2007 - 14:40 #2
i princippet sådan her ikke
String tag1="";
       
        if(tag.item(i).getNodeValue() != null){
        tag1 = tag.item(i).getNodeValue();
        }
Avatar billede mik28 Seniormester
13. november 2007 - 14:44 #3
det virker ikke :-(
Avatar billede ladyhawke Novice
13. november 2007 - 15:00 #4
du kan ikke getNodeValue på noget der er null, tjek først item(i) om den er null og hvis det ikke er nok så tjek om tag.length eller hvad den nu hedder (antallet af items på tag) er større end 0
Avatar billede mik28 Seniormester
13. november 2007 - 15:01 #5
problemet er vel at jeg ikke kan afgøre om den er null. I det jeg forsøger at læse den og den ikke findes bliver exceptionen smidt :-(((((
Avatar billede ladyhawke Novice
13. november 2007 - 15:04 #6
hvorfor i alverden kan du ikke afgøre det?

iNoget i de her stil (jeg koder desværre JSP, så syntaksen er ikke 100%)
if (tag.Length > 0 ){
  if(tag(i)!=null){ (udfør kode her)....

  }
}
Avatar billede ladyhawke Novice
13. november 2007 - 15:15 #7
sorry, det inderste "null"-tjek skal jo være tag.item(i)
Avatar billede arne_v Ekspert
13. november 2007 - 15:49 #8
hvis din for loekke er:

for(int i = 0; i < tag.getLength(); i++) {

hvordan kan du saa faa null ??
Avatar billede mik28 Seniormester
14. november 2007 - 08:46 #9
Forviringen er total. Kan jeg få et eksempel hvor værdierne i <bla> og <bla1> bliver skrevet ud. Hvis jeg nu har

NodeList alleMineItems = XPathAPI.selectNodeList(trae, ".//channel/item/*");

Hvordan får jeg så de to navngivne elementer ud for hver item, og kun dem??
Avatar billede mik28 Seniormester
14. november 2007 - 08:47 #10
<bla> og <bla1> er children til item
Avatar billede mik28 Seniormester
14. november 2007 - 09:26 #11
Mit problem i en nøddeskald er at rss'en ser således ud

<rss version="2.0">
  <channel>
    <title>jjj</title>
    <link>http://ggggg</link>
    <description>ggg</description>
    <language>da</language>
    <lastBuildDate>Wed, 14 Nov 2007 09:21:45 GMT</lastBuildDate>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator></generator>
    <numberOfRows xmlns=''></numberOfRows>
    <rssid xmlns=''>2007-11-14T09:21:45+01:00</rssid>
    <player xmlns=''></player>
    <item>
      <title><![CDATA[fff]]></title>
      <file>bhjubui</file>
      <description><![CDATA[hjguygiugiu]]></description>
      <pubDate>Wed, 14 Nov 2007 05:41:38 GMT</pubDate>
      <pubDate2>14.11.2007</pubDate2>
      <createdby xmlns=''><![CDATA[ggg]]></createdby>
      <updatedby xmlns=''><![CDATA[hhh]]></updatedby>
      <artikel xmlns=''><![CDATA[]]></artikel>
      <duration xmlns=''><![CDATA[91.72]]></duration>
      <opphav xmlns=''><![CDATA[]]></opphav>
      <clipid xmlns=''><![CDATA[12205]]></clipid>
      <artikelid xmlns=''><![CDATA[359142]]></artikelid>
      <enclosure url="http://ljhnjjk"  type="image/png" />
      <click xmlns=''><![CDATA[628]]></click>
      <click24hours xmlns=''><![CDATA[628]]></click24hours>
      <click7days xmlns=''><![CDATA[628]]></click7days>
      <category>a</category>
      <category>b</category>
      <category>c</category>
      <tag xmlns=''>a, b, c</tag>
    </item>

<item>
      <title><![CDATA[fff]]></title>
      <file>bhjubui</file>
      <description><![CDATA[hjguygiugiu]]></description>
      <pubDate>Wed, 14 Nov 2007 05:41:38 GMT</pubDate>
      <pubDate2>14.11.2007</pubDate2>
      <createdby xmlns=''><![CDATA[ggg]]></createdby>
      <updatedby xmlns=''><![CDATA[hhh]]></updatedby>
      <artikel xmlns=''><![CDATA[]]></artikel>
      <duration xmlns=''><![CDATA[91.72]]></duration>
      <opphav xmlns=''><![CDATA[]]></opphav>
      <clipid xmlns=''><![CDATA[12205]]></clipid>
      <artikelid xmlns=''><![CDATA[359142]]></artikelid>
      <enclosure url="http://ljhnjjk"  type="image/png" />
      <click xmlns=''><![CDATA[628]]></click>
      <click24hours xmlns=''><![CDATA[628]]></click24hours>
      <click7days xmlns=''><![CDATA[628]]></click7days>
    </item>
Avatar billede mik28 Seniormester
14. november 2007 - 09:27 #12
hvis tag så ikke findes har jeg misseren
Avatar billede ladyhawke Novice
14. november 2007 - 09:36 #13
så er du i din løkke stadig nødt til at at lave en if-sætning...

Hvordan henter du "tag", hvis det er en del af din nodelist, så må det være noget i denne stil:

(nodeitem er én af dine noder i alleMineItems)

if (nodeitem.<forsøg at finde tag> != null (eller -1 hvis det er hvad funktionen returnerer)

du har jo opdaget problemet, men du har også fået svaret: du SKAL undersøge om tag findes FØR du forsøger at gøre noget med den, ellers får du fejl...
Avatar billede ladyhawke Novice
14. november 2007 - 09:40 #14
Du kan måske bruge noget a la:

nodelist tags = nodeitem.getElementsByTagName("tag") og hvis tags ikke indeholder noget, så findes tag ikke for den node...
Avatar billede mik28 Seniormester
14. november 2007 - 09:47 #15
Jeg har selvfølgelig prøvet at gøre som du siger men det virker altså ikke. Jeg har også opdaget et andet problem, som betyder at tingene kommer ud af synk
Avatar billede mik28 Seniormester
14. november 2007 - 09:48 #16
Det ville være kanon med et jsp eksempel
Avatar billede ladyhawke Novice
14. november 2007 - 10:16 #17
Det vil sikkert være fint med et eksempel, men jeg har ikke tid til at læse op på JSP nu, så der må en anden til, hvis du ikke kan oversætte pseudokoden...

dit andet problem, hvad består det i?

Prøv evt. at poste hele den kode (ikke bare nogle udklip) du bruger til at hente tags
Avatar billede arne_v Ekspert
15. november 2007 - 04:27 #18
Parse kode:

package november;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XPathFun {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse("C:\\z.xml");
        NodeList many = XPathAPI.selectNodeList(doc.getDocumentElement(), "//rss/channel/item");
        for(int i = 0; i < many.getLength(); i++) {
            Element one = (Element)many.item(i);
            Node title = XPathAPI.selectSingleNode(one, "title/text()");
            Node tag = XPathAPI.selectSingleNode(one, "tag/text()");
            if(tag != null) {
                System.out.println(title.getNodeValue() + " is " + tag.getNodeValue());
            } else {
                System.out.println(title.getNodeValue() + " (no tag)");
            }
        }
    }
}

du må selv migrere til JSP kontekst.
Avatar billede mik28 Seniormester
15. november 2007 - 06:14 #19
tak fro hjælpen
Avatar billede arne_v Ekspert
27. januar 2008 - 05:52 #20
Tid at få afsluttet her ?
Avatar billede arne_v Ekspert
28. oktober 2008 - 03:03 #21
?
Avatar billede mik28 Seniormester
28. oktober 2008 - 06:46 #22
ja. Læg et svar
Avatar billede arne_v Ekspert
28. oktober 2008 - 14:05 #23
kommer 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
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