Avatar billede bha140795 Nybegynder
23. januar 2007 - 15:09 Der er 11 kommentarer og
1 løsning

Importering af XML-fil

Findes der en måde således, at man kan importere en XML-fil uden at få den delt op i et antal selvstændige tabeller, der ikke umiddelbart kan knyttes sammen. Det er dette der sker når man anvender den almindelige importfunktion, altså ved at sige Filer--> Hent eksterne data-->Importer og vælger XML i filtype?
Avatar billede terry Ekspert
23. januar 2007 - 16:48 #1
Is ther any relationship between the "tables" in the xml file? If there isnt then it isnt easy for Access to guess what you want to do.

Can we see an example of your xml?
Avatar billede oz1aiv Nybegynder
23. januar 2007 - 20:28 #2
Du skal lave en ombrydning/transfom af xml-filen og derefter en import.

Først skal du lave en xsd-fil, som definerer felterne du vil anvende og som svarer til din access-tabel du vil importere i. Access-tabellen må gerne indeholde andre felter, end dem du importerer til.

Dernæst skal du lave en xsl-fil (transform), som definerer udtrækket fra din xml-fil. Transformen skriver en ny xml-fil med det format og indhold, som du har defineret i xsl-filen. Transform kommandoen kan du evt. lave i vba.

Dernæst importerer du den nye xml-fil til tabellen i Access - evt via vba.
Avatar billede bha140795 Nybegynder
24. januar 2007 - 10:52 #3
nedenstående er et eksempel på den XML-fil det drejer sig om. Jeg kunne godt tænke mig lidt flere konkrete hints om, hvad jeg skal gøre.


<?xml version="1.0" encoding="utf-8"?>
<EmploymentInformation creationTime="2007-01-24T10:45:24" key="KN 2107572107 2007-01-24 StatusActiveIndicator StatusPassiveIndicator DepartmentIndicator ProfessionIndicator StatusIndicator WorkingTimeIndicator SalaryCodesIndicator SalaryAggrementIndicator" >
    <InstitutionCode>KN</InstitutionCode>
    <Person>
        <CivilRegistrationNumber>xxxxxx-xxxx</CivilRegistrationNumber>
        <Name>
            <PersonGivenName>Test</PersonGivenName>
            <PersonSurnameName>Testesen</PersonSurnameName>
        </Name>
        <PostalAddress>
            <StreetName>Testvej 2</StreetName>
            <PostCodeIdentifier>8200</PostCodeIdentifier>
            <DistrictName>Århus N</DistrictName>
            <PersonNationalityCode>DK</PersonNationalityCode>
        </PostalAddress>
        <TelephoneNumber>TestTelefonnr</TelephoneNumber>
        <Employment>
            <EmploymentNumber>TestTjenestenr</EmploymentNumber>
            <EmploymentDate>1992-11-01</EmploymentDate>
            <Department>
                <EffectiveFromDate>1992-11-01</EffectiveFromDate>
                <EffectiveToDate>9999-12-31</EffectiveToDate>
                <DepartmentCode>ÅGS</DepartmentCode>
                <DepartmentCodeName>It-Afdelingen</DepartmentCodeName>
            </Department>
            <Profession>
                <EffectiveFromDate>2005-01-01</EffectiveFromDate>
                <EffectiveToDate>9999-12-31</EffectiveToDate>
                <ProfessionCode>3010</ProfessionCode>
                <ProfessionCodeName>teststilling</ProfessionCodeName>
                <EmploymentProfessionName>Teststilling</EmploymentProfessionName>
                <AppointmentCode>
                </AppointmentCode>
            </Profession>
            <Status>
                <EffectiveFromDate>1992-11-01</EffectiveFromDate>
                <EffectiveToDate>9999-12-31</EffectiveToDate>
                <EmploymentStatusCode>1</EmploymentStatusCode>
            </Status>
            <WorkingTime>
                <EffectiveFromDate>1992-11-01</EffectiveFromDate>
                <EffectiveToDate>9999-12-31</EffectiveToDate>
                <EmploymentWorkingRate>1.0000</EmploymentWorkingRate>
                <EmploymentSalaryRate>1.0000</EmploymentSalaryRate>
                <EmploymentPartTimeWorkCode>0</EmploymentPartTimeWorkCode>
            </WorkingTime>
            <SalaryCodes>
                <EffectiveFromDate>1992-11-01</EffectiveFromDate>
                <EffectiveToDate>9999-12-31</EffectiveToDate>
                <EmploymentPensionCode>0</EmploymentPensionCode>
            </SalaryCodes>
            <SalaryAggrement>
                <EffectiveFromDate>2006-04-01</EffectiveFromDate>
                <EffectiveToDate>9999-12-31</EffectiveToDate>
                <SalaryAggrementNumber>33233</SalaryAggrementNumber>
                <SalaryClass>221</SalaryClass>
                <SalaryStep>1</SalaryStep>
                <EmploymentSalaryTypeCode>0</EmploymentSalaryTypeCode>
                <EmploymentSeniorityDate>9999-12-31</EmploymentSeniorityDate>
            </SalaryAggrement>
        </Employment>
    </Person>
</EmploymentInformation>
Avatar billede terry Ekspert
24. januar 2007 - 11:17 #4
If you use Access built in Import wizard then it is going to import the data into different tables.
I know very little about xml but if you want to do something else with the xml then I think you will need to use xsd/xsl which oz1aiv suggests.

It is also possible to work directly with XML in Access too.

Anyway here are a few links you may be able to use

http://msdn.microsoft.com/XML/XMLDownloads/default.aspxhttp://msdn.microsoft.com/XML/XMLCodeSamples/default.aspx
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconxmldocumentobjectmodeldom.asp


http://msdn2.microsoft.com/en-us/library/aa167823(office.11).aspx
Avatar billede terry Ekspert
24. januar 2007 - 11:18 #5
Avatar billede oz1aiv Nybegynder
25. januar 2007 - 01:31 #7
Der er jo ikke nogen, der har sagt at det skulle være nemt....., det er nu heller ikke så svært, som det ser ud til. Nedenstående er afprøvet og det virker. Dermed ikke sagt, at det ikke kunne gøres på en nemmere måde.


Jeg har lavet en prototype på import af dine xml-filer.
Bemærk at jeg anvender mappen C:\experten til alle filer. Bruger du andre mapper, skal du huske at rette i stierne i filerne. Jeg kalder din oprindelige xml-fil for staff.xml.

Gem følgende i filen tabel1.xsd og gem den i mappen c:\experten:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Tabel1" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="generated" type="xsd:dateTime"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Tabel1">
</xsd:sequence>
</xsd:element>


og gem følgende i tabellen staff.xsl  og gem den i mappen c:\experten:

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

<xsl:output method="xml" indent="yes"/>


<xsl:template match="/*[local-name()='/']">
   
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="C:\experten\tabel1.xsd" generated="2006-12-15T13:14:58">
   
        <xsl:apply-templates select="/"/>
    </dataroot>

</xsl:template>

<xsl:template match="/">

    <tabel1>
   
        <!-- henter institutionskode -->
        <InstitutionCode>
            <xsl:value-of select="EmploymentInformation/InstitutionCode"/>
        </InstitutionCode>


        <!-- henter cprnr -->
        <CivilRegistrationNumber>
            <xsl:value-of select="EmploymentInformation/Person/CivilRegistrationNumber"/>
        </CivilRegistrationNumber>
       

        <!-- henter arbejdstid fra dato -->
        <WT_EffectiveFromDate>
            <xsl:value-of select="EmploymentInformation/Person/Employment/WorkingTime/EffectiveFromDate"/>
        </WT_EffectiveFromDate>
       

        <!-- henter beskaeftigelsesdecimal -->
        <WT_EmploymentWorkingRate>
            <xsl:value-of select="EmploymentInformation/Person/Employment/WorkingTime/EmploymentWorkingRate"/>
        </WT_EmploymentWorkingRate>
       

    </tabel1>
</xsl:template>
</xsl:stylesheet>


I Access kan du mauelt importere xml-filen via menuen Filer - Hent eksterne data - Importer.  Når du får vinduet 'Importer XML' vælger du 'Indstillinger' og markerer 'Tilføj data til eksisterende tabel'. I samme vindue vælger du 'Transformering' og tryk på knappen 'Tilføj'. Find 'staff.xsl' og tryk på 'Tilføj'. Tryk derefter på 'OK', hvorefter data importeres til tabellen 'tabel1'. Ved manuel import, skal du hver gang vælge 'Indstillinger' og 'Transformering'.


I stedet for den manuelle import kan du bruge lave en funktion i VBA - noget i retning af:

Function xmlimport()
' Function xmlimport(indfilnavn)
Dim filnavn, xmlfil, xlsfil As String

filnavn = indfilnavn

Set fs = Application.FileSearch
With fs
    .LookIn = "C:\experten"
    .SearchSubFolders = True
    .FileName = filnavn
    If .Execute() > 0 Then
       
        xmlfil = "C:\experten\staff.xml" 'staff.xml er den oprindelige xml-fil
        xlsfil = "C:\experten\staff.xsl"
        outputXML = "C:\experten\oXML.xml"

        'danner en ny xml-fil med ønsket indhold "C:\experten\oXML.xml"
        Application.TransformXML xmlfil, xlsfil, outputXML
   
        'importerer den nye xml-fil "C:\experten\oXML.xml" og tilføjer data i tabellen
        Application.ImportXML outputXML, acAppendData
   
    End If
End With

End Function

Funktionen virker. Den kan aktiveres med F5, når du står i Visual Basic. Du opdager formodentligt ikke at den kører, men prøv at åbne tabellen 'tabel1'.
Avatar billede bha140795 Nybegynder
25. januar 2007 - 15:42 #8
Virker - tak for det
Avatar billede terry Ekspert
25. januar 2007 - 17:51 #9
Nice oz1aiv, I'll be able to make use of that myself :o)
Avatar billede oz1aiv Nybegynder
26. januar 2007 - 01:17 #10
Dejligt at det virker. Det er nok tvivlsomt om du kan bruge det på dine rigtige data. Formodentligt har du flere <Employment> på samme person. Hvis det er tilfældet skal du have ændret i xsl-filen.

<xsl:template match="/*[local-name()='/']">
skal ændres til
<xsl:template match="/*[local-name()='Employment']">

og

<xsl:template match="/">
skal ændres til
<xsl:template match="Employment">



Herefter skal du hente data relativt i forhold til <Employment> (tidligere i forhold til øverste niveau 'EmploymentInformation'):
<xsl:value-of select="EmploymentInformation/Person/CivilRegistrationNumber"/>
skal ændres til
<xsl:value-of select="../CivilRegistrationNumber"/>

(hvor "../" betyder et niveau op.)

og

<xsl:value-of select="EmploymentInformation/Person/Employment/WorkingTime/EffectiveFromDate"/>
skal ændres til
<xsl:value-of select="WorkingTime/EffectiveFromDate"/>



I øvrigt vil du nok også få brug for 'choose' og 'if', som er vist i disse eksempler:

<feltnavnx1>
<xsl:choose>
    <xsl:when test="WorkingTime/EffectiveFromDate[.!='']">
    <xsl:value-of select="../CivilRegistrationNumber"/>   
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="WorkingTime/EmploymentWorkingRate"/>
    </xsl:otherwise>
</xsl:choose>
</feltnavnx1>

og

<feltnavnx2>
<xsl:if test="WorkingTime/EmploymentWorkingRate[.!='']">
    <xsl:value-of select="../PostalAddress/StreetName"/>
</xsl:if>
</feltnavnx2>
Avatar billede bha140795 Nybegynder
26. januar 2007 - 07:36 #11
jer er i tvivl om jeg har accepteret svaret?
Avatar billede bha140795 Nybegynder
26. januar 2007 - 07:37 #12
det ser ud til at det har jeg nu
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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