Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[Java] Selectie in XML

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer vanuit Java doormiddel van SAX een selectie elementen te verkrijgen uit een XML file (alle childs van één parrent). Het lukt mij wel om alle elementen te verkrijgen maar dus niet één selectie.

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 12:15

Haan

dotnetter

Het zou handig zijn als je even een stukje code neerzet met hoe je het nu probeert te doen ;)

Ik heb even snel op SAX gezocht (kende het niet), maar dat ziet er ook niet zo eenvoudig uit.. Misschien dat je ook XPATH kan gebruiken, dat werkt imo vrij makkelijk.

Kater? Eerst water, de rest komt later


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07:40

Creepy

Tactical Espionage Splatterer

En wat heb je nu zelf al geprobeerd? Wat lukte daar niet mee? Heb je een concreet voorbeeld? etc. etc. Wil je Programming Beleid en dan met nameProgramming Beleid - De Quickstart eens doorlezen? Daarin staat uitgelegd wat we hier van je verwachten. Een vraag dumpen zonder verdere informatie en hopen op een oplossing is in elk geval niet de bedoeling.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Creepy schreef op woensdag 07 mei 2008 @ 15:05:
En wat heb je nu zelf al geprobeerd? Wat lukte daar niet mee? Heb je een concreet voorbeeld? etc. etc. Wil je Programming Beleid en dan met nameProgramming Beleid - De Quickstart eens doorlezen? Daarin staat uitgelegd wat we hier van je verwachten. Een vraag dumpen zonder verdere informatie en hopen op een oplossing is in elk geval niet de bedoeling.
Sorry, ik zal proberen het te verduidelijken.

Hieronder staat een trainingsschema in XML.
Met dit trainingsschema geef ik per minuut aan welke snelheid er verricht moet worden.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<distance lenght="5">
 <week number="1">
  <day number="1">
   <style>Speedstep/Duur</style>
   <zone>Zone 1</zone>
   <minute>70</minute>
   <minute>70</minute>
   <minute>70</minute>
  </day>

  <day number="2">
   <style>Basic Jump/Tempo</style>
   <zone>Zone 2</zone>
   <minute>72</minute>
   <minute>72</minute>
   <minute>72</minute>
  </day>
 </week>
</distance>


Bovenstaande gegevens wil ik gebruiken in Java maar niet allemaal in één keer. Ik wil bijvoorbeeld alleen de gegevens van dag "1" (zone, style en minute) kunnen opvragen zonder dat dag "2" opgevraagd wordt.

Hieronder staat de Java code om het XML bestand volledig uit te lezen met behulp van SAX.
Ik hoop dat het hierdoor wat duidelijker is.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class XML extends DefaultHandler {

    public String style;
    public String zone;

    private CharArrayWriter contents = new CharArrayWriter();


    public void startElement(String namespaceURI, String localName, String qName, Attributes attr)       
    throws SAXException {
        contents.reset();
    }

    public void endElement(String namespaceURI, String localName, String qName) throws                  
    SAXException {

        if (localName.equals("style")) {
            style = contents.toString();
        }
        if (localName.equals("zone")) {
            zone = contents.toString();
        }
    }

    public void characters(char[] ch, int start, int length) throws SAXException {
        contents.write(ch, start, length);
    }

    public static void main(String[] argv) {
        try {
            XMLReader xr = XMLReaderFactory.createXMLReader();
            XML ex2 = new XML();
            xr.setContentHandler(ex2);
            xr.parse(new InputSource(new FileReader("C:/trainingen.xml")));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 13:34
Even lichtelijk offtopic, maar is het ook mogelijk en dat er meer dan drie <minute> elementen in een <day> zitten, waarvan de waarde repeterend is of dat repetitie überhaupt het meest veelvuldig voorkomt? Is het dan niet compacter en handiger om de boel om te draaien en een sequence van <intensity> of <speed> elementen te gebruiken met een duration attribuut in seconden/minuten?

[ Voor 8% gewijzigd door Kwistnix op 07-05-2008 16:21 ]


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 17-11 22:11

Nick_S

++?????++ Out of Cheese Error

Je moet even goed in de gaten houden wat een saxparser precies doet. Het doorloopt je document en vuurt events af bij bepaalde zaken (startElement, endElement, etc) Je moet dus iets met deze events doen.

Laat me raden, uit deze code kreeg je alleen de style en zone van het laatste element?

Wil je dit perse met een SAX Parser doen, zul je iets meer logica hierin moeten bouwen. Je zou ook eens kunnen kijken naar een DOM parser (Document Object Model), waarmee je je elementen kan doorlopen. Kijk dan ook even naar de verschillen tussen DOM en SAX, als je een groot document hebt, wil je geen DOM. Groot kan per applicatie verschillen.

Kijk ook eens naar Object-to-XML mapping tools zoals JiBX.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
In totaal komen er 60 minuten in, waarom ik dit zo heb gedaan staat in het volgende topic:
[XML] Element of Attribuut

Verwijderd

SAX loopt als een Stream door je data heen en roept callback-methods aan.
DOM loopt door je data heen en bouwt voor jou een boomstructuur in memory.

Beide lopen dus door je hele document heen.
DOM is alleen handig als je je data echt bij elkaar moet scharrelen en je geen zin hebt om van alles bij te gaan houden of om zes keer je SAX parser aan te gooien voordat je al je data hebt.

Je kunt in SAX het idee hebben dat je wel klaar bent, maar je kunt SAX niet zomaar stoppen. De enige manier om SAX te stoppen is door een Exception te gooien. Exceptions zijn echter ook kostbaar, dus misschien is het gewoon beter om SAX door te laten lopen en verdere input te negeren, maar dat is aan jou om te beslissen.

Als het XML bestand niet zo groot is is het niet erg of je DOM of SAX gebruikt en of je een paar keer te veel of te lang aan het parsen bent. Als je XML tientallen MB's gaat worden zul je toch liever SAX gebruiken, zeker wanneer dit op een server gebeurt en als je na vijf records klaar bent terwijl er nog enkele honderden MB's aan tekst te parsen is kun je wellicht een Exception gooien om je parser te stoppen.

Overigens kun je misschien beter een StringBuilder of een StringBuffer gebruiken ipv een CharArrayWriter. Althans, dat zie ik vaker, misschien dat een CharArrayWriter net zo goed werkt, ik kan er eigenlijk weinig over vinden.

[ Voor 44% gewijzigd door Verwijderd op 07-05-2008 17:01 ]


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Ik ben benieuwd waarom de TS voor een SAX parser gekozen heeft. DOM documenten i.s.m. XPath zijn veel makkelijker als je specifieke elementen wilt benaderen.

https://niels.nu


Verwijderd

Hydra schreef op woensdag 07 mei 2008 @ 18:46:
Ik ben benieuwd waarom de TS voor een SAX parser gekozen heeft. DOM documenten i.s.m. XPath zijn veel makkelijker als je specifieke elementen wilt benaderen.
Zo ingewikkeld is SAX nou ook weer niet. Persoonlijk doe ik net zo lief SAX

Verwijderd

Topicstarter
Bedankt voor alle reacties, [Hydra] ik heb voor SAX gekozen omdat deze sneller grote bestanden kan verwerken, dit kan namelijk in de toekomst het geval zijn.

[Nick_S] Ik krijg idd style en zone eruit.

[The_Tzar] Ik ga morgen even kijken naar StringBuffer en StringBuilder maar, ik moet dus alle elementen laten inladen (in Java) en dan daaruit de selectie maken?

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Verwijderd schreef op woensdag 07 mei 2008 @ 18:50:
Zo ingewikkeld is SAX nou ook weer niet. Persoonlijk doe ik net zo lief SAX
Het is niet ingewikkelder, het is anders. En je gebruikt het voor andere toepassingen.

https://niels.nu


Verwijderd

Topicstarter
Moet ik in de methode characters nu de gegevens halen en in een tabel stoppen? Heb net gehoord dat het eventueel in een hashtable kan? Kan dit, is dit goed?

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 17-11 22:11

Nick_S

++?????++ Out of Cheese Error

Om je even een beetje op weg te helpen (hoop ik):
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
class XML extends DefaultHandler {

    private CharArrayWriter contents = new CharArrayWriter();

    private List<Day> dayList = new ArrayList<Day>();
    private Day day;

    public void startElement(String namespaceURI, String localName,
            String qName, Attributes attr) throws SAXException {
        if (localName.equals("day")) {
            day = new Day(Integer.parseInt(attr.getValue("number")));
        }
        contents.reset();
    }

    public void endElement(String namespaceURI, String localName, String qName)
            throws SAXException {

        if (localName.equals("style")) {
            day.setStyle(contents.toString());
        }
        if (localName.equals("zone")) {
            day.setZone(contents.toString());
        }
        if (localName.equals("day")) {
            dayList.add(day);
        }
    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {
        contents.write(ch, start, length);
    }

    public static void main(String[] argv) {
        try {
            XMLReader xr = XMLReaderFactory.createXMLReader();
            XML ex2 = new XML();
            xr.setContentHandler(ex2);
            xr.parse(new InputSource(new FileReader("C:/trainingen.xml")));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Day {

    public Day(int number) {
        this.number = number;
    }

    private int number;
    private String style;
    private String zone;

    public String getStyle() {
        return style;
    }

    public void setStyle(final String style) {
        this.style = style;
    }

    public String getZone() {
        return zone;
    }

    public void setZone(final String zone) {
        this.zone = zone;
    }

    public int getNumber() {
        return number;
    }
}


[Edit] Je zal ook nog iets met de Weken moeten doen, maar het idee lijkt me duidelijk.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
Je bent een held!
Ik ga ermee aan de gang...
Dank je!

Verwijderd

Topicstarter
Ik kom er nog steeds niet uit.
Hoe kan ik de dag aangeven die opgevraagd moet worden?

Sorry voor dit alles, maar ik begrijp het nog niet helemaal.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:55

Janoz

Moderator Devschuur®

!litemod

Sorry, maar het werken met een lijst (de List<Day>) lijkt mij toch wel tot de basis vaardigheden van het programmeren horen. Op dit moment ben je al een heel eind op weg geholpen, maar ik kan me niet aan de indruk onttrekken dat je hier eigenlijk constant bij het handje genomen moet worden.

Probeer gewoon de je aangeleverde code stap voor stap door te nemen en te begrijpen wat er in elke stap gebeurt. Verder raad ik je aan om eens even wat op te zoeken over het werken met collections (zoals List). Zoals ik eerder al zei valt dat wel een beetje onder de basiskennis. Zonder dat je dat begrijpt is het uitleggen ook een beetje ondoenlijk.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Prima, ik ga verder zoeken.
Pagina: 1