Avatar billede jespersahner Nybegynder
18. marts 2006 - 12:09 Der er 15 kommentarer og
1 løsning

org.w3c.dom: Finde Element relativt i Document

Er det muligt at finde elementer fra en relativ position i et dokument?

Hvis f.eks. et dokument indeholder en masse tabeller, og man er interesseret i at finde en bestemt celle i en bestemt tabel, kunne en fremgangsmåde være, at man først finder den relevante tabel og derefter cellen i den konkrete tabel.

Man kan naturligvis traversere hele dokumentet igennem, men det kan være tungt. Jeg efterspørger i stedet en løsning, hvor man udnytter f.eks. metoden getElementsByTagName() (hvor man jo ikke behøver traversere dokumentet igennem).

Antag f.eks. at man først finder tabellen med:
  ..getElementsByTagName("table");

- og dernæst finder cellen relativt til tabellen (altså søgende fra den position i dokumentet hvor tabellen er fundet) med:
  ..getElementsByTagName("td");

Er det muligt?
Avatar billede Slettet bruger
18. marts 2006 - 12:21 #1
Det er kun Document som har getElementsByTag/Id osv. så det kan du ikke da Node ikke har sådanne funktioner.
Avatar billede grunken Nybegynder
18. marts 2006 - 12:24 #2
Hvilket bliver til :

tabeller = document.getElementsByTagName("table");
for(i=0;i<tabeller.length;i++)
{
    celler = tabeller[i].document.getElementsByTagName("td")
    for(j=0;j<celler.length;j++)
    {
        if(celler[j]) //din condition
        {
            celle = celler[j];
            break;
        }
    }
}

Men er det det ikke nemmere at give de berørte celler en id eller anden unik idetifier ?

Og til en anden gang - så husk at kategorien skal være javascript :-)
Avatar billede grunken Nybegynder
18. marts 2006 - 12:25 #3
og en copy bug :-)

tabeller = document.getElementsByTagName("table");
for(i=0;i<tabeller.length;i++)
{
    celler = tabeller[i].getElementsByTagName("td")
    for(j=0;j<celler.length;j++)
    {
        if(celler[j]) //din condition
        {
            celle = celler[j];
            break;
        }
    }
}
Avatar billede jespersahner Nybegynder
18. marts 2006 - 12:27 #4
->grunken: Nej, det er et Java-spm.; det er Java-implementeringen af DOM jeg her spørger til.
Avatar billede jespersahner Nybegynder
18. marts 2006 - 12:28 #5
->grunken: Jeg læser et dokument, som jeg ikke selv har oprettet; derfor kan jeg ikke (nødvendigvis) spørge på ID.
Avatar billede arne_v Ekspert
18. marts 2006 - 20:47 #6
Du kan finde det med XPath
Avatar billede arne_v Ekspert
18. marts 2006 - 20:48 #7
<?xml version='1.0' standalone='yes'?>
<medlemmer>
    <medlem no="11">
        <navn>Niels Nielsen</navn>
        <adresse>Nellikevej 19</adresse>
    </medlem>
    <medlem no="12">
        <navn>Jens Jensen</navn>
        <adresse>Jagtvej 17</adresse>
    </medlem>
    <medlem no="13">
        <navn>Ole Olsen</navn>
        <adresse>Omfartsvejen 13</adresse>
    </medlem>
</medlemmer>
Avatar billede arne_v Ekspert
18. marts 2006 - 20:48 #8
package march;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import org.apache.xpath.XPathAPI;

public class TagIndex {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse("C:\\test.xml");
            Element res2 = (Element)XPathAPI.selectSingleNode(doc.getDocumentElement(), "/medlemmer/medlem[2]");
            Element name2 = (Element)res2.getElementsByTagName("navn").item(0);
            System.out.println(name2.getFirstChild().getNodeValue());
            Element res1 = (Element)XPathAPI.selectSingleNode(doc.getDocumentElement(), "/medlemmer/medlem[1]");
            Element name1 = (Element)res1.getElementsByTagName("navn").item(0);
            System.out.println(name1.getFirstChild().getNodeValue());
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
18. marts 2006 - 20:48 #9
hvor jeg finder det andet og det første medlem
Avatar billede jespersahner Nybegynder
18. marts 2006 - 22:02 #10
->arne_v: XPath ser mere tilgængeligt ud end DOM. I dit eksempel udnytter du, at navn er indeholdt i medlem. Mit spm. går på noget lidt anderledes, og mit eks. er rigtig dårligt i den sammenhæng, fordi <td> jo er indeholdt i <table>.

Jeg skal prøve at give et andet og bedre eksempel:
Antag at en HTML-side indeholder en masse tabeller og noget "fri tekst" mellem tabellerne. Man er herefter interesseret i førstkommende tabel efter en bestemt tekst. Det er ikke givet, at tabellen her er indeholdt i det tag, der indeholder teksten. Man er med andre ord blot interesseret i at søge fra et bestemt sted i dokumentet og fremefter.
Avatar billede arne_v Ekspert
19. marts 2006 - 00:23 #11
se det var jo en lidt anden sag

en walker måske ??
Avatar billede jespersahner Nybegynder
13. maj 2006 - 04:15 #12
Smid gerne et svar en af jer.
Avatar billede jespersahner Nybegynder
16. maj 2006 - 16:15 #13
Kom så! :-)
Avatar billede arne_v Ekspert
16. maj 2006 - 17:04 #14
hvem har bidraget med noget ?
Avatar billede jespersahner Nybegynder
17. maj 2006 - 07:42 #15
->arne_v: Smid du bare et svar.
Avatar billede arne_v Ekspert
17. maj 2006 - 13:15 #16
ok
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