Avatar billede netkoen Nybegynder
11. februar 2010 - 10:43 Der er 12 kommentarer

Hent værdi fra XML - TD fra en HTML tabel

Hej Alle

Min frustration bliver større og større.

Jeg har hentet en hjemmeside ned fra nettet, konverteret hele hjemmesiden til XML, fundet den korrekt tabele jeg ønsker at hente data ud fra, er yderligere kommet ned til den kolonne "td" som jeg ønsker at hente data ud fra.

Ved at bruge metoden: tdNode.getNodeName(); ved jeg det er en "td", men jeg kan simpelthen ikke få data ud af kolonnen.

Har prøvet følgende:
tdNode.getFirstChild().getNodeValue();
tdNode.getNodeValue();
tdNode.getFirstChild().getTextContent();
tdNode.getTextContent();

Ingen af disse metoder giver mig noget data. Er der nogle der ved hvad jeg har gjort galt?

Det skal siges at jeg har en anden funktion, hvor jeg bruger tdNode.getFirstChild().getNodeValue(); til at hente data ud fra en tabel og den virker uden problemer. Har sammenlignet begge metoder og kan ikke finde nogle forskelle.

På forhånd tak for hjælpen

Hilsen Daniel
Avatar billede netkoen Nybegynder
11. februar 2010 - 11:50 #1
Det drejer sig forresten om en tabel med følgende opbygning:

<table>
<tr>
<td>DATA JEG VIL HAVE UD</td>
</tr>
</table>

(Attributter udeladt)

Altså en simpel tabel bestående af en række og en kolonne

Jeg har den rigtige tabel som en "Node" variable, så hvis nogen eventuelt havde et kode eksempel som viser hvordan jeg får dataen ud fra "td" elementet, så ville jeg være meget taknemmelig.

Har med vilje ikke sat hele metoden ind, da den nok forvirre mere end den gavner.
Avatar billede netkoen Nybegynder
11. februar 2010 - 11:56 #2
For at tilføje yderligere, så har jeg lige forsøgt at hente data om attributterne for "td" og det lykkedes uden problemer.
Avatar billede fsconsult.dk Nybegynder
11. februar 2010 - 12:34 #3
for det første, er det svært at sige hvad du laver forkert, når du ikke forklarer præcist hvad du skriver, og hvad du får af fejl.

for det andet, er det nærliggende at gætte på, at det formentlig er javaSCRIPT og ikke java du tænker på ?
Avatar billede netkoen Nybegynder
11. februar 2010 - 13:18 #4
Det er skam ganske almindelig java - ikke javascript.

Hvis det er til nogen hjælp så kan jeg da lige smide koden her:

public void Test(StringReader r){
        System.out.println("TEST AF SIDE VISNING");
        Tidy t = new Tidy();
        t.setQuiet(true);
        t.setShowWarnings(false);
        org.w3c.dom.Document tidyDOM = t.parseDOM(r, null);
        org.w3c.dom.NodeList n = tidyDOM.getElementsByTagName("table");
       
        //Finder den rette tabel
        System.out.println("Antal tabeller: " + n.getLength());
        for(int i = 0; i < n.getLength(); i++){
            Node Tablenodes = n.item(i);
            System.out.println("Test");
            if(Tablenodes.hasAttributes()){
                NamedNodeMap nnm = Tablenodes.getAttributes();
                Node Classnode = nnm.getNamedItem("class");
                Node CellPaddingNode = nnm.getNamedItem("cellpadding");
                //Test af tabel attributter
                if(Classnode != null && CellPaddingNode != null){
                    String ClassValue = Classnode.getNodeValue();
                    String CellPaddingValue = CellPaddingNode.getNodeValue();
                    System.out.println("Class: " + ClassValue + "CellP: " + CellPaddingValue);
                    //Finder den rigtige tabel
                    if(ClassValue.equalsIgnoreCase("head_box") && CellPaddingValue.equalsIgnoreCase("1")){

****HERFRA OG NED LIGGER PROBLEMET - KAN IKKE FÅ INDHOLDET AF TD UD****
                          org.w3c.dom.NodeList trNodes = Tablenodes.getChildNodes();
                          System.out.println("Antal rækker: " + trNodes.getLength());
                          Node trNode = trNodes.item(0);
                               
                          org.w3c.dom.NodeList tdNodes = trNode.getChildNodes();
                          System.out.println("Antal TD: " + tdNodes.getLength());
                         
                          //Den korrekte kolonne
                          Node tdNode = tdNodes.item(0);

                          if(tdNode.hasAttributes()){
                              NamedNodeMap tdAtt = tdNode.getAttributes();
                              Node tdClassNode = tdAtt.getNamedItem("class");
                              System.out.println("Class: " + tdClassNode.getNodeValue());
                          }                         
                                   
                            String nodeType = tdNode.getNodeName();
                            String nodeName = tdNode.getNodeName();
                            String test3 = tdNode.getTextContent();
                            String test = tdNode.getFirstChild().getNodeValue();
                            System.out.println("Værdi: " + test + "Type: " + nodeType + "Værdi2: " + test3);
                         
                    }
                }
            }
        }
       
    }

Den er nok en smule forvirrende, men det er også rimelig meget work in progress
Avatar billede arne_v Ekspert
11. februar 2010 - 16:14 #5
Hvis tdNode peger paa <td>DATA JEG VIL HAVE UD</td> saa boer tdNode.getFirstChild().getNodeValue() returnere "DATA JEG VIL HAVE UD".

Du kan proeve at udskrive nodes for at se hvad de indeholder og hvor det gaar galt.
Avatar billede arne_v Ekspert
11. februar 2010 - 16:14 #6
Eller bedre - skift til XPath.

Det er langt nemmere at fiske "//table/tr/td/text()" ud.

:-)
Avatar billede arne_v Ekspert
12. februar 2010 - 02:07 #7
Demo:

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;

public class XPathFun {
    public static void main(String[] args) throws Exception {
        String s = "<html><head><title>XPathFun</title></head><body><table id='1'><tr><td>DATA JEG IKKE VIL HAVE UD</td></tr></table><table id='2'><tr><td>DATA JEG VIL HAVE UD</td></tr></table></body></html>";
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader(s)));
        XPath xpath = XPathFactory.newInstance().newXPath();
        Node wanted = (Node)xpath.evaluate("//html/body/table[@id='2']/tr/td/text()", doc.getDocumentElement(), XPathConstants.NODE);
        System.out.println(wanted.getNodeValue());
    }
}
Avatar billede netkoen Nybegynder
14. februar 2010 - 18:52 #8
Får følgende fejl når koden forsøger at ændre hjemmesiden til XML

[Fatal Error] :335:46: The entity "nbsp" was referenced, but not declared.

Det skal siges at siden jeg henter data fra er enormt ringe designet rent kodemæssigt, så er XPath rent følsom overfor dårligt designet sider, eller kan den selv sortere ting fra?

Og et helt andet spørgsmål. Er nedenstående en korrekt måde at identificere en tabel?
Node wanted = (Node) xpath.evaluate("//html/body/table[@class='headbox'][@cellpadding='1']/tr/td/text()", doc.getDocumentElement(), XPathConstants.NODE);

Altså med to [] for at bestemme tabellen
Avatar billede arne_v Ekspert
14. februar 2010 - 20:57 #9
Det er nok snarere:

Node wanted = (Node) xpath.evaluate("//html/body/table[@class='headbox' and @cellpadding='1']/tr/td/text()", doc.getDocumentElement(), XPathConstants.NODE);

du vil bruge.
Avatar billede arne_v Ekspert
14. februar 2010 - 20:58 #10
XML er generelt følsomt overform forkert XML.

Men måske kan du fake nbsp entityen.
Avatar billede arne_v Ekspert
15. februar 2010 - 04:39 #11
fake = modificere de data som din StringReader læser fra
Avatar billede arne_v Ekspert
01. marts 2010 - 01:02 #12
netkoen?
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