Toon posts:

xml importeren in access 2000

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een gedeelte voor mijn project op school moeten we order_gegevens vanuit een xml bestand invoeren in een bestaande relationele access2000 DB.

Access 2000 heeft geen import functie voor xml, maar wel voor bijv. txt bestanden. Echter, de waarden moeten dan achter elkaar staan gescheiden door komma`s, m.b.v macro`s kun je die gegevens wel goed plaatsen in de db.

Hier ben ik nu:
Waarschijnlijk is het dus het gemakkelijkste om mbv Java( de taal waarin ik kan programmeren, nou ja...) de xml code om te zetten naar dat txt bestand waarin de waarden zijn gescheiden door komma`s. Mijn vraag is nu: Hoe moet dat?? Ik lees hier een daar wel wat over JDOM en SAX maar het is het hier een beetje de klok en de klepel...

Of is het bijvoorbeeld makkelijker gewoon de xml direct te importeren in de DB met behulp van ASP ? Alle hulp is welkom.. :?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
pietersg: Voor een gedeelte voor mijn project op school moeten we order_gegevens vanuit een xml bestand invoeren in een bestaande relationele access2000 DB.
Zie ook dit topic: [topic=374759/1/25]
Waarschijnlijk is het dus het gemakkelijkste om mbv Java( de taal waarin ik kan programmeren, nou ja...) de xml code om te zetten naar dat txt bestand waarin de waarden zijn gescheiden door komma`s. Mijn vraag is nu: Hoe moet dat?? Ik lees hier een daar wel wat over JDOM en SAX maar het is het hier een beetje de klok en de klepel...
Je kunt dat inderdaad wel doen en het is ook niet zo erg moeilijk, maar wel rot-werk :) . Je bent in feite een transformatie hard uit aan het programmeren en daar hebben we nu juist een transformatie-taal voor: XSLT. Het kost misschien wat tijd om je er even in te verdiepen, maar daar heb je later natuurlijk ook nog wat aan :) . Met XSLT kan je op een hele eenvoudige manier een XML document transformeren naar een andere vorm. Dit kan ook een komma-gescheiden tekst-file zijn :) .

Als je het toch in een general-purpose taal wilt implementeren moet je je XML inlezen. Dit kan oa met twee methoden: SAX en DOM. DOM bouwt een boom voor je op die het XML representeert. SAX is event-gebaseerd: je krijgt via events de info uit de file binnen. Je bent zelf verantwoordelijk voor het bijhouden hiervan...

Zie voor algemene XML-inlees-info ook:
[topic=324232/1/25]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Op woensdag 09 januari 2002 12:08 schreef pietersg het volgende:
Hier ben ik nu:
Waarschijnlijk is het dus het gemakkelijkste om mbv Java( de taal waarin ik kan programmeren, nou ja...) de xml code om te zetten naar dat txt bestand waarin de waarden zijn gescheiden door komma`s. Mijn vraag is nu: Hoe moet dat?? Ik lees hier een daar wel wat over JDOM en SAX maar het is het hier een beetje de klok en de klepel...
Kijk anders even naar Zeus. Daarmee kun je makkelijk XML omzetten in Java-objecten. Die Java-objecten geef je een toText() functie mee die de values uitschrijft in komma-delimited formaat en klaar is pietersg.

With the light in our eyes, it's hard to see.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je voor een Java-XML data binding oplossing wilt gaan kan je ook JAXB of Castor gebruiken. Zie dit artikel op Javaworld voor uitleg over dergelijke aanpakken :) :

http://www.javaworld.com/javaworld/jw-12-2001/jw-1228-jaxb.html?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op woensdag 09 januari 2002 14:47 schreef mbravenboer het volgende:
Als je voor een Java-XML data binding oplossing wilt gaan kan je ook JAXB of Castor gebruiken. Zie dit artikel op Javaworld voor uitleg over dergelijke aanpakken :) :

http://www.javaworld.com/javaworld/jw-12-2001/jw-1228-jaxb.html?
ik denk dat ik daar maar eens mee ga beginnen, ik geen zin om in de 20 uurtjes die voordeze opdracht staan even xslt te leren...

Als het niet lukt dan laat ik het meteen horen :)

Verwijderd

Topicstarter
mwoa, dat met jaxb is ook wel goed moeilijk.

Ik heb een nieuwe manier bedacht:
met asp. Met behulp van de microsoft xml parser de gegevens inlezen en dan met een insert query de boel in de tabellen zetten. Iemand ervaring mee? zo ja, misschien wat voorbeeld code want dat met die xml parsers blijft voor mij erg vaag.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
pietersg: mwoa, dat met jaxb is ook wel goed moeilijk.
Valt wel mee, als je een goede DTD hebt hoef je haast niets te doen.
Ik heb een nieuwe manier bedacht
Wat is daar nieuw aan? Dat is gewoon handmatig de XML inlezen zoals ik eerder beschreef en omzetten naar sql inserts. Veel werk en ranzige code, maar wellicht een optie als je geen zin/tijd hebt om andere technieken te leren...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Blijkbaar heeft xslt een groot voordeel. Langzamerhand begin ik dat nu ook in te zien. Helaas loop ik wel vast, maar het einde (van het begin :) ) is in zicht.

Ik zal laten zien wat ik tot nu toe heb gedaan:
Als basis (een stukje van het xml bestand)
code:
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
<?xml version="1.0" encoding="UTF-8"?>
<transactionSet code="purchase_order">
    <name>Purchase Order</name>
    <segment code="UNH">
      <name>MESSAGE HEADER</name>
      <element code="0062">
        <name>Message reference number</name>
        <value>3422348</value>
      </element>
      <element code="S009">
        <name>MESSAGE IDENTIFIER</name>
        <value/>
        <element code="0065">
            <name>Message type identifier</name>
            <value/>
        </element>
        <element code="0052">
            <name>Message type versiion number</name>
            <value/>
        </element>
        <element code="0054">
            <name>Message type release number</name>
            <value/>
        </element>
        <element code="0051">
            <name>Controlling agency</name>
            <value/>
        </element>
      </element>
    </segment>

Nu de xsl code
code:
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
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            version="1.0">
 
    <xsl:output method="text"/>
    
    <xsl:template match="/transactionSet/segment">
      
    <xsl:text>[segment]&#xD;&#xA;</xsl:text>
    <xsl:apply-templates select="element"/>
            
    </xsl:template>

    <xsl:template match="element">
      <xsl:text>[element]</xsl:text>
    <xsl:apply-templates select="name"/>
    <xsl:apply-templates select="value"/>
            
    </xsl:template>

        <xsl:template match="name">
      <xsl:text>name=</xsl:text>
    <xsl:value-of select="."/>
      
    </xsl:template>
    
        <xsl:template match="value">
      <xsl:text>‚waarde=</xsl:text>
    <xsl:value-of select="."/>

    </xsl:template>

Hiermee krijg ik dit op m`n beeld...(een stukje van de uitvoer)
code:
1
2
3
4
5
6
    name=Purchase Order
    [segment]
[element]name=Message reference numberwaarde=3422348[element]name=MESSAGE IDENTIFIERwaarde=
    [segment]
[element]name=Document/message numberwaarde=
    [segment]

Het probleem is dat er i.p.v komma`s rechthoekjes verschijnen, terijl ik volgens mij wel de juiste hex-code heb. Deze verschijnen echter ook als ik de komma helemaal weglaat, uit het niets lijkt het wel. Waar ik dus mee zit, hoe krijg ik de goede scheiding(dus met een komma) tussen de uitgelezen waarden?
(je ziet ze helaas niet, maar tussen de naam=*** en waarde=*** staan ze...)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Leuk dat je ermee aan de slag bent gegaan :) .

Ik probeer te ontcijferen wat je bedoelingen zijn, maar dat lukt nog niet zo 1,2,3 ;) . Kan je misschien een stukje data posten wat je wilt bereiken? (wat de output dus moet zijn)

Dan kan ik vergelijken wat je nu hebt en wat de bedoeling is...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik heb vast een klein beetje zitten spelen.... Ik heb geen flauw idee wat je output moet zijn, dus heb maar iets gemaakt wat ik er leuk uit vind zien ;) . Wellicht dat je het hiermee zelf kunt oplossen. Als je een output geeft kan ik je uiteraard nog wel meer in de goede richting sturen :) .

Stylesheet:
code:
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
<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            version="1.0">
 
    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="text()"/>

    <xsl:template match="/transactionSet">
      <xsl:apply-templates select="segment"/>
    </xsl:template>
    
    <xsl:template match="/transactionSet/segment">
      <xsl:text>[segment]
</xsl:text>
      <xsl:apply-templates select="element"/>
    </xsl:template>

    <xsl:template match="element">
      <xsl:text>[element]</xsl:text>

      <xsl:apply-templates select="name"/>
      <xsl:apply-templates select="value"/>

      <xsl:text>
</xsl:text>
            
    </xsl:template>

    <xsl:template match="name">
      <xsl:text>name=</xsl:text>
      <xsl:value-of select="."/>
    </xsl:template>
    
    <xsl:template match="value">
      <xsl:text>, waarde=</xsl:text>
      <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>

Output:
code:
1
2
3
[segment]
[element]name=Message reference number, waarde=3422348
[element]name=MESSAGE IDENTIFIER, waarde=

Maar goed: dit zal vast niet de bedoeling zijn :) . Misschien dat de werking wel duidelijk wordt zo...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
okee, wat ik wil is dit:(optimale situatie :) )
code:
1
2
[segment_naam],[element_code], naam_van_element, waarde_van_element,((als er nesting van elementen is) [element_code], naam_van_element, waarde_van_element,[/element]) [/element]
[segment_naam],[element_code], naam_van_element,enzoverder

Ik hoop dat het zo wat duidelijker is. Er hoeven geen harde spaties, maar ik heb dit gedaan om de leesbaarheid te verbeteren.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ah das beter :) .

Ik zal wel ff een voorbeeld maken.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op woensdag 09 januari 2002 22:49 schreef mbravenboer het volgende:
Maar goed: dit zal vast niet de bedoeling zijn :) . Misschien dat de werking wel duidelijk wordt zo...
Je zit er gevaarlijk dichtbij (8>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je hebt daar staan:
code:
1
[/element]

Is dat letterlijk of moet dat element_code zijn?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
letterijk, dan is de output iets beter leesbaar, zeker als er binnen één element nog andere elementen voorkomen.

De andere zijn allemaal variabelen.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ok, hier is een voorbeeld. Details kan je vast zelf bijwerken. Ik wist bijvoorbeeld niet helemaal wat ik met een lege value aanmoest.

Ik heb bij jouw gegeven input nu deze output:
code:
1
2
[MESSAGE HEADER],[0062], Message reference number, 3422348, [/element]
[MESSAGE HEADER],[S009], MESSAGE IDENTIFIER, , [0065], Message type identifier, , [/element][0052], Message type versiion number, , [/element][0054], Message type release number, , [/element][0051], Controlling agency, , [/element][/element]

Dit zaakje is gegeneerd door deze stylesheet:
code:
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
<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            version="1.0">
 
    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="text()"/>

    <xsl:template match="/transactionSet">
      <xsl:apply-templates select="segment"/>
    </xsl:template>
    
    <xsl:template match="segment">
      <xsl:variable name="segment-name" select="name/text()"/>

      <xsl:for-each select="element">
        <xsl:text>[</xsl:text>
            <xsl:value-of select="$segment-name"/>
        <xsl:text>],</xsl:text>

        <xsl:apply-templates select="current()"/>
      <xsl:text>
</xsl:text>
      </xsl:for-each>
    </xsl:template>

    <xsl:template match="element">
      <xsl:text>[</xsl:text>
      <xsl:value-of select="@code"/>
      <xsl:text>], </xsl:text>

      <xsl:apply-templates select="name"/>

      <xsl:text>, </xsl:text>

      <xsl:apply-templates select="value"/>

      <xsl:text>, </xsl:text>

      <xsl:apply-templates select="element"/>

      <xsl:text>[/element]</xsl:text>
    </xsl:template>

    <xsl:template match="name">
      <xsl:value-of select="text()"/>
    </xsl:template>
    
    <xsl:template match="value">
      <xsl:value-of select="text()"/>
    </xsl:template>
</xsl:stylesheet>

beetje naar wens? :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Vind je het niet een prachtige oplossing? Moet je je eens voorstellen hoeveel code zou kosten in gp-taal x en hoe onduidelijk die code zou zijn :) .

Deze stylesheet is nog een beetje lastig gemaakt omdat je naar plain-text moet transformeren, maar als je naar xml moet transformeren is het werkelijk een plaatje ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
ja, dit is echt perfect. Heel erg bedankt!!!

En ja, ik geef het toe, ik was ook eerst een beetje sceptisch maar dat xsl is echt een uitkomst. Ik zal eens ff m`n leraren vreemd laten kijken, 99% zeker dat zij er nog nooit van hebben gehoord, en dit ook niet bedacht hadden. Juist zij liepen te ouwehoeren over xml parsers in java >:)

THNX

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
pietersg: ja, dit is echt perfect. Heel erg bedankt!!!
Graag gedaan :) . Voor een mooie oplossing span ik me graag ff in :) .
Ik zal eens ff m`n leraren vreemd laten kijken, 99% zeker dat zij er nog nooit van hebben gehoord, en dit ook niet bedacht hadden. Juist zij liepen te ouwehoeren over xml parsers in java >:)
Haha :) . Verspreid het blijde evangelie maar ja ;) .

XSLT kan je op verrassend veel plaatsen uitstekend inzetten. Je moet het niet misbruiken, maar dit valt wat mij betreft niet in de categorie misbruik :) .

XML inlezen met de low-level dom, sax of pull libraries is verschrikkelijk. De eerste keer dat je zoiets maakt ben je trots dat je XML hebt ingelezen. De tweede keer begint het te vervelen :O . De derde keer erger je je dood aan de massa onduidelijke code en de vierde keer heb je er geen zin meer in ;) . Dit leerproces heb jij nu helaas moeten missen, maar ja ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • TheZign
  • Registratie: Januari 2002
  • Laatst online: 09-10-2025
Dat met xslt is heel mooi:D.
Maar is het ook mogelijk om nu niet de hele troep in te lezen, maar puur de value's zodat het er ongeveer als volgt uit komt te zien.

00043069;IBIT BV;24-11-1993;24-01-1994;60;nlg

Dit is namelijk makkelijk te importeren in access, zonder te veel bewerkingen.
Ik hoop dat iemand me hier antwoordt op kan geven.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Uiteraard is dat mogelijk. Je moet alleen de stylesheet dan iets aanpassen zodat alleen de values overblijven en er op de goede plaatsen newlines worden ingevoegd :) .

Erg moeilijk is dat niet. Heb je al ervaring met XSLT?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Misschien heel dom hoor:
Waarom niet in Access 2000 met behulp van VBA?
Zet een reference naar Microsoft XML DOM Object nogwat bla bla en lees je XML in en voeg rechtstreeks in je MDB in.

't Is misschien te simpel geredeneerd maar wie weet...

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
hvdberg: Misschien heel dom hoor:
Woordspeling? ;) .
Zet een reference naar Microsoft XML DOM Object nogwat bla bla en lees je XML in en voeg rechtstreeks in je MDB in.
Die oplossing is ook al eerder besproken, dus zo vreemd is hij niet. Het vervelende van deze oplossing is dat je onprettige code krijgt. Het verwerken van een DOM is geen plezier werk als de data wat gecompliceerder wordt.

Het punt van deze oplossing is de simpele analyse dat je in feite een transformatie aan het uitvoeren bent. Je kunt transformeren naar het import-formaat van de database, maar bijvoorbeeld ook naar SQL statements. Een transformatie kunnen we mooi uitdrukken in een echte transformatie-taal: XSLT.

Het is dus niet zozeer dat de handmatige DOM oplossing niet werkt, maar een XSLT oplossing zal denk ik meestal duidelijkere en compactere code opleveren :) .

Nadeel is dat je XSLT moet leren, maar dat is ook zeer nuttige kennis in andere gebieden. :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • TheZign
  • Registratie: Januari 2002
  • Laatst online: 09-10-2025
Bedankt voor je reactie.
Ik heb helaas geen ervaring met xslt, ik ben de afgelopen dagen wel bezig geweest aan de hand van de code van mbravenboer. Ik ben nu wel zover dat ik alleen de values krijg.
Ik moet echter een specifiekere selectie maken. Het idee is als volgt.

We krijgen een order met 1 of 2 orderregels, deze order wordt door een xediml software getrokken en daaruit volgt het xml bestand.
Dit xml bestand moet dan worden gefilterd op zo'n manier dat het makkelijk is in te voeren in een aanwezige database in access.

Het liefst nog zo dat de orderregel(s) apart staan.

Is hier een reletief eenvoudige oplossing voor die je me kunt uitleggen, ik kan dit namelijk niet duidelijk vinden in tig van tutorials die ik online heb gezien.
Het word namelijjk hoofdzakelijk gebruikt om de opmaak te veranderen en niet voor een tekstbestand.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
TheZign: Ik ben nu wel zover dat ik alleen de values krijg.
Das al heel wat :) .
Ik moet echter een specifiekere selectie maken. Het idee is als volgt.
Waarop moet je dan selecteren?
We krijgen een order met 1 of 2 orderregels.
Het liefst nog zo dat de orderregel(s) apart staan.
Je bedoelt gewoon op een nieuwe regel?

Als je niet exacter uitlegt hoe je XML eruit ziet, wat je nu hebt en wat je wilt bereiken kan ik niet zoveel helpen :) . Misschien eens kijken naar de manier waarop ik hierboven newlines invoer? Als je meer vertelt kan ik je misschien de goede kant op sturen :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
das vast een projectgroeplid uit een paralel groep ofzow *D

Je kan heel makkelijk met macro's en append query`s de waarden uit het .text bestand in de DB kwijt. Als je alleen de waarden uit de xml wil vissen moet je in je <xsl: apply templates> een attribuut opgeven bijv '@ordernummer'> Zo kan je echt alleen de gegevens die je nodig hebt eruit halen, maar das overbodig werk so why do it...

Hier werkt het perfect. Morgen d-day dus suc6.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Heb je je docent al laten schrikken met deze oplossing? ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1