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....
Annonceindlæg fra QNAP
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
Det kan muligvis gøres smartere, men det var lige hvad jeg kunne komme i tanke om !
Du skal ikke være så beskeden :o) det er for vildt, jeg er måløs... takker mange gange..
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
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.
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
Det virker ikke sådan umidelbart af sig selv. Men det kan godt bringes til at virke. Jeg prøver lige.
<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>
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(); } } }
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
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)
12. juni 2003 - 10:37
#12
he he vil også gerne forstår, hvad der foregår
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.
12. juni 2003 - 11:06
#14
Den tager ikke rigtig den der putAll()
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)
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 !!
12. juni 2003 - 11:29
#17
Du kan ikke give mig flere point. 200 er maximum.
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"
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(); } } }
12. juni 2003 - 11:51
#20
Du er sku for sej... Takker og bukker
12. juni 2003 - 12:21
#21
Igen er der andre måder at lave det på, men jeg plejer at bruge keyset og iterator.
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)
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.
12. juni 2003 - 12:52
#24
tak for din tid, har løst det..
Kurser inden for grundlæggende programmering