Avatar billede t_mons Nybegynder
11. juni 2003 - 23:57 Der er 23 kommentarer og
1 løsning

indlæse xml i java

Hey  endnu et spørgsmål, angående xml og java

mit konkrete problem er, at jeg gerne på en nem måde -
1. først skal jeg hente input id'et (er klaret)
2. de underlæggende regler for det specifikke input id.(kan klare det på måde nr.1 - MEN hvordan kan man organiserer sine data sådan at 'input id:110' gælder følgende regler 1,2,3,4  og ligeledes at 'input id:111' gælder følgende regler 5,6,7,8)

Kan man egentlig sætte de input id'er og deres tilhørende regler op i et todimensionel ArrayList, eller noget i den stil....

Jeg har en xml fil der ser ud som følgende
<input id="110">
  <regel id="1" felt="123"/>
  <regel id="2" felt="456"/>
  <regel id="3" felt="789"/>
  <regel id="4" felt="010"/>
</input>

<input id="111">
  <regel id="5" felt="123"/>
  <regel id="6" felt="456"/>
  <regel id="7" felt="789"/>
  <regel id="8" felt="010"/>
</input>

Min java kode ser således ud:

NodeList regelInput = doc.getElementsByTagName("input");
  for (int i = 0; i < regelInput.getLength(); i++)
  {         
          Node element = regelInput.item(i);
          NamedNodeMap attribs = element.getAttributes();
    String id = attribs.getNamedItem("id").getNodeValue();
    System.out.println("id er :" +id);
  }


KAN man hente childnodes for regelInput ?????


Giver min forklaring overhovedet mening !!! :o)

Jeg er løbet ind i en mur hele dagen....
Avatar billede arne_v Ekspert
12. juni 2003 - 08:22 #1
Input fil:

<inputs>

<input id="110">
  <regel id="1" felt="123"/>
  <regel id="2" felt="456"/>
  <regel id="3" felt="789"/>
  <regel id="4" felt="010"/>
</input>

<input id="111">
  <regel id="5" felt="123"/>
  <regel id="6" felt="456"/>
  <regel id="7" felt="789"/>
  <regel id="8" felt="010"/>
</input>

</inputs>

Program:

import java.io.File;
import java.io.IOException;

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

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class RegelParser {
  public static void main(String[] args) {
      try {
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          DocumentBuilder db = dbf.newDocumentBuilder();
          Document doc = db.parse(new File("C:\\regel.xml"));
          NodeList elements = doc.getElementsByTagName("input");
          for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            String id = element.getAttributes().getNamedItem("id").getNodeValue();
            System.out.println("input ID = " + id);
            NodeList regler = element.getChildNodes();
            for(int j = 0; j < regler.getLength(); j++) {
                if(regler.item(j).getNodeType() == Node.ELEMENT_NODE) {
                    Node regel = regler.item(j);
                    NamedNodeMap attr = regel.getAttributes();
                    String regelid = attr.getNamedItem("id").getNodeValue();
                    String felt = attr.getNamedItem("felt").getNodeValue();
                    System.out.println("  " + regelid + " " + felt);
                }
            }
          }
      } catch (FactoryConfigurationError e) {
          e.printStackTrace();
      } catch (ParserConfigurationException e) {
          e.printStackTrace();
      } catch (SAXException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
}


Output:

input ID = 110
  1 123
  2 456
  3 789
  4 010
input ID = 111
  5 123
  6 456
  7 789
  8 010
Avatar billede arne_v Ekspert
12. juni 2003 - 08:22 #2
Det kan muligvis gøres smartere, men det var lige hvad jeg kunne komme
i tanke om !
Avatar billede t_mons Nybegynder
12. juni 2003 - 09:31 #3
Du skal ikke være så beskeden :o)  det er for vildt, jeg er måløs...

takker mange gange..
Avatar billede t_mons Nybegynder
12. juni 2003 - 09:37 #4
Ville lige høre, om du kunne hjælpe mig med en sidste ting, opretter gerne et nyt spørgsmål...

hvis jeg nu vil gemme mine 'input id'er' i et todimensionelt array (ved ikke hvor mange der er på forhånd) med deres tilsvarende 'regel id'... det kan forekomme at der er flere med samme input id'er, og deres regel id'er så bare skal ligges til de allerede gemte...

endnu et kryptiske spørgsmål.. hi hi
Avatar billede arne_v Ekspert
12. juni 2003 - 09:52 #5
Måske vil du finde følgende interessant:

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

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

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class RegelParser {
  public static void main(String[] args) {
      try {
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          DocumentBuilder db = dbf.newDocumentBuilder();
          Document doc = db.parse(new File("C:\\regel.xml"));
          NodeList elements = doc.getElementsByTagName("input");
          HashMap input = new HashMap();
          for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            String id = element.getAttributes().getNamedItem("id").getNodeValue();
            //System.out.println("input ID = " + id);
            NodeList regler = element.getChildNodes();
            HashMap regelmap = new HashMap();
            for(int j = 0; j < regler.getLength(); j++) {
                if(regler.item(j).getNodeType() == Node.ELEMENT_NODE) {
                    Node regel = regler.item(j);
                    NamedNodeMap attr = regel.getAttributes();
                    String regelid = attr.getNamedItem("id").getNodeValue();
                    String felt = attr.getNamedItem("felt").getNodeValue();
                    //System.out.println("  " + regelid + " " + felt);
                    regelmap.put(regelid, felt);
                }
            }
            input.put(id, regelmap);
          }
          System.out.println(input);
          System.out.println((String)((HashMap)input.get("111")).get("6"));
      } catch (FactoryConfigurationError e) {
          e.printStackTrace();
      } catch (ParserConfigurationException e) {
          e.printStackTrace();
      } catch (SAXException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
}

det outputter nemlig:

{111={6=456, 5=123, 8=010, 7=789}, 110={4=010, 3=789, 2=456, 1=123}}
456

På den måde kan du nemt slå op med input id og regel id og finde felt.
Avatar billede t_mons Nybegynder
12. juni 2003 - 10:08 #6
det ser sku godt ud, mit problem er bare at der sagtens kan være flere indput id'er der er ens dog med andre regel id'er...
kan man så bare add dem i forlængelse af feks.
111={6=456, 5=123, 8=010, 7=789} + 9=011, 10=012
Avatar billede arne_v Ekspert
12. juni 2003 - 10:12 #7
Det virker ikke sådan umidelbart af sig selv.

Men det kan godt bringes til at virke.

Jeg prøver lige.
Avatar billede arne_v Ekspert
12. juni 2003 - 10:17 #8
<inputs>

<input id="110">
  <regel id="1" felt="123"/>
  <regel id="2" felt="456"/>
  <regel id="3" felt="789"/>
  <regel id="4" felt="010"/>
</input>

<input id="111">
  <regel id="5" felt="123"/>
  <regel id="6" felt="456"/>
  <regel id="7" felt="789"/>
  <regel id="8" felt="010"/>
</input>

<input id="111">
  <regel id="9" felt="011"/>
  <regel id="10" felt="012"/>
</input>

</inputs>
Avatar billede arne_v Ekspert
12. juni 2003 - 10:17 #9
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

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

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class RegelParser {
  public static void main(String[] args) {
      try {
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          DocumentBuilder db = dbf.newDocumentBuilder();
          Document doc = db.parse(new File("C:\\regel.xml"));
          NodeList elements = doc.getElementsByTagName("input");
          HashMap input = new HashMap();
          for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            String id = element.getAttributes().getNamedItem("id").getNodeValue();
            //System.out.println("input ID = " + id);
            NodeList regler = element.getChildNodes();
            HashMap regelmap = new HashMap();
            for(int j = 0; j < regler.getLength(); j++) {
                if(regler.item(j).getNodeType() == Node.ELEMENT_NODE) {
                    Node regel = regler.item(j);
                    NamedNodeMap attr = regel.getAttributes();
                    String regelid = attr.getNamedItem("id").getNodeValue();
                    String felt = attr.getNamedItem("felt").getNodeValue();
                    //System.out.println("  " + regelid + " " + felt);
                    regelmap.put(regelid, felt);
                }
            }
            if(input.get(id) == null) {
                input.put(id, regelmap);
            } else {
                ((HashMap)input.get(id)).putAll(regelmap);
                input.put(id, (HashMap)input.get(id));
            }
          }
          System.out.println(input);
          System.out.println((String)((HashMap)input.get("111")).get("6"));
      } catch (FactoryConfigurationError e) {
          e.printStackTrace();
      } catch (ParserConfigurationException e) {
          e.printStackTrace();
      } catch (SAXException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
}
Avatar billede arne_v Ekspert
12. juni 2003 - 10:18 #10
{111={6=456, 5=123, 10=012, 9=011, 8=010, 7=789}, 110={4=010, 3=789, 2=456, 1=123}}
456
Avatar billede t_mons Nybegynder
12. juni 2003 - 10:35 #11
else
{
  ((HashMap)input.get(id)).putAll(regelmap);
  input.put(id, (HashMap)input.get(id));
}

forstår ikke lige de 2 linjer 
1. hvad gør puttAll(regelmap)
2. DEN SIDSTE LINIE
:o)
Avatar billede t_mons Nybegynder
12. juni 2003 - 10:37 #12
he he vil også gerne forstår, hvad der foregår
Avatar billede arne_v Ekspert
12. juni 2003 - 11:00 #13
Logikken er:

hvis input id ikke allerede eksisterer så {
  gem input id med regler
} ellers {
  tilføf de nye regler til det eksisterende input id
  gem det der er under eksisternde input id under eksisterende input id  // total overflødig
}

den sidste linie er ikke nødvendig.

Men det gik lidt stærkt. Jeg beklager.
Avatar billede t_mons Nybegynder
12. juni 2003 - 11:06 #14
Den tager ikke rigtig den der putAll()
Avatar billede arne_v Ekspert
12. juni 2003 - 11:11 #15
Compile fejl eller ?

Har du copy pastet min kode direkte ?

(det er meget vigtigt at parenteserne står som de står)
Avatar billede t_mons Nybegynder
12. juni 2003 - 11:24 #16
Jamen, det er mig der sover.... sorry Glemte typecaste til HashMap...:o)

Jeg har ikke prøvet at ligge HashMap i HashMap før, køre man bare på .size() når man vil udskrive hele "input hashmap" eller hur..
har du evt. en skitse ??

Og hvordan kan jeg give dig lidt flere point !!
Avatar billede arne_v Ekspert
12. juni 2003 - 11:29 #17
Du kan ikke give mig flere point.

200 er maximum.
Avatar billede t_mons Nybegynder
12. juni 2003 - 11:32 #18
jamen du har reddet min dag... takker.,
du skulle ikke ligge inde med hvordan man løber "input Map" igennem og udskriver ligeledes "regel Map"
Avatar billede arne_v Ekspert
12. juni 2003 - 11:45 #19
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;

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

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class RegelParser {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File("C:\\regel.xml"));
            NodeList elements = doc.getElementsByTagName("input");
            HashMap input = new HashMap();
            for (int i = 0; i < elements.getLength(); i++) {
                Node element = elements.item(i);
                String id =
                    element.getAttributes().getNamedItem("id").getNodeValue();
                NodeList regler = element.getChildNodes();
                HashMap regelmap = new HashMap();
                for (int j = 0; j < regler.getLength(); j++) {
                    if (regler.item(j).getNodeType() == Node.ELEMENT_NODE) {
                        Node regel = regler.item(j);
                        NamedNodeMap attr = regel.getAttributes();
                        String regelid = attr.getNamedItem("id").getNodeValue();
                        String felt = attr.getNamedItem("felt").getNodeValue();
                        regelmap.put(regelid, felt);
                    }
                }
                if (input.get(id) == null) {
                    input.put(id, regelmap);
                } else {
                    ((HashMap) input.get(id)).putAll(regelmap);
                }
            }
            System.out.println(input);
            System.out.println((String) ((HashMap) input.get("111")).get("6"));
            Iterator itinput = input.keySet().iterator();
            while (itinput.hasNext()) {
                String id = (String) itinput.next();
                System.out.println(id);
                HashMap hm = (HashMap) input.get(id);
                Iterator itregel = hm.keySet().iterator();
                while (itregel.hasNext()) {
                    String regelid = (String) itregel.next();
                    String felt = (String) hm.get(regelid);
                    System.out.println("  " + regelid + " " + felt);
                }
            }
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede t_mons Nybegynder
12. juni 2003 - 11:51 #20
Du er sku for sej...

Takker og bukker
Avatar billede arne_v Ekspert
12. juni 2003 - 12:21 #21
Igen er der andre måder at lave det på, men jeg plejer at bruge keyset og iterator.
Avatar billede t_mons Nybegynder
12. juni 2003 - 12:26 #22
jeg sidder lige og kæmper med følgende:

jeg har et hashmap, som jeg tildeler et id (feks. 1) og value (feks. "Hej")
men jeg kan ikke rigtig ligge flere Strings på samme id (1) feks. " med dig"

Kan det lade sig gøre overhoved eller skal jeg pakke values ind i et nyt hashmap ??

det er vist sidst spørgsmål for idag... :o)
Avatar billede arne_v Ekspert
12. juni 2003 - 12:42 #23
Nej - en key i en hash map kan kun pege på et objekt.

Hvis du skal have flere værdier ind skal du bruge et
container objekt f.eks. ArrayList hvis det kun er værdier
og HashMap hvis det er key's med værdier.
Avatar billede t_mons Nybegynder
12. juni 2003 - 12:52 #24
tak for din tid, har løst det..
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