Avatar billede Kim Neesgaard Seniormester
26. august 2007 - 18:23 Der er 10 kommentarer og
2 løsninger

Lav en SQL forespørgsel på en xml-fil

Jeg har en xml-fil, der stammer fra indtastning i en InfoPathformular.
xml-filen er fx. i 2 niveauer: fornavn + efternavn og en række tilhørende telefonnumre (fastnet, mobil, arbejds etc.).
Oplysningerne fra xml-filen vil jeg gerne gemme i en Access database, men grundet de to niveauer skal det være i to tabeller: en tabel med navne og en anden med telefonnumrene.
Det ville derfor være godt, hvis man kunne oprette en forbindelse til xml-filen og lave to forskellige SQL og gemme resultaterne i hver sin tabel.
Jeg er helt sikker på, at det kan lade sig gøre, men har ikke kunnet finde svaret i andre spørgsmål.
Kan I hjælpe med et konkret eksempel?
Avatar billede neoman Novice
26. august 2007 - 18:42 #1
Har du prøvet Import i Access ? Den kan importere XML (har dog ikke prøvet selv), og gad vide om den ikke er smartere end man tror ? :)
Avatar billede arne_v Ekspert
26. august 2007 - 18:53 #2
læs XML ind i XmlDocument
iterer med SelectNodes eller GetElementsByTagName
for hver item konstruer SQL udfra noder i XML
Avatar billede dr_chaos Nybegynder
26. august 2007 - 22:15 #3
Tjaa i asp.net 3.5 kan man bruge linq til at forespørge mod xml filer men det er nok en anelse uaktuelt før final release kommer  :)
Ellers gør som arne foreslår.
Avatar billede Kim Neesgaard Seniormester
27. august 2007 - 08:32 #4
neoman -> Jeg vil gerne gøre det via kode.

arne_v + dr_chaos ->

Altså noget i denne stil:

Dim xmlfilnavn As String = Server.MapPath("Formular.xml")
Dim objXMLdoc As New XmlDocument()
objXMLdoc.Load(xmlfilnavn)

Men herefter kan jeg ikke rigtig få felterne ud? Brug af InnerText skriver det hele ud?
Avatar billede arne_v Ekspert
27. august 2007 - 15:24 #5
XmlDocument har nogle metoder:
  SelectNodes
  SelectSingleNode
  GetElementsByTagName
som kan fiske dele ud.
Avatar billede Kim Neesgaard Seniormester
27. august 2007 - 16:39 #6
Ok - med

Response.Write(objXMLdoc.SelectSingleNode("descendant::Navn").InnerText)

får jeg den første ud, men hvordan fisker jeg de næste ud?
Avatar billede dr_chaos Nybegynder
28. august 2007 - 21:08 #7
Noget med
Foreach(XmlNode xn in objXMLdoc.SelectNodes("descendant::Navn"))
{

Response.Write(xn.InnerText)
}

eller måske objXMLdoc.SelectNodes("//Navn")
Avatar billede Kim Neesgaard Seniormester
28. august 2007 - 21:44 #8
Ja - jeg har fået dette til at vise dem alle:

Dim xmlfilnavn As String = Server.MapPath("Simpel-xml.xml")
Dim objXMLdoc As New XmlDocument()
objXMLdoc.Load(xmlfilnavn)
Dim book As XmlNode
Dim nodeList As XmlNodeList
Dim root As XmlNode = objXMLdoc.DocumentElement

nodeList = root.SelectNodes("descendant::Navn")

For Each book In nodeList
  Response.Write(book.InnerText & "<br>")
Next

Lægger I svar?
Avatar billede dr_chaos Nybegynder
28. august 2007 - 21:51 #9
svar :)
Avatar billede arne_v Ekspert
29. august 2007 - 02:54 #10
Et komplet eksempel:

<?xml version='1.0' encoding='UTF-8'?>
<kartotek>
    <person>
        <fornavn>Anders</fornavn>
        <efternavn>Andersen</efternavn>
        <telefonnumre>
            <telefonnummer type='fast'>11111111</telefonnummer>
            <telefonnummer type='mobil'>22222222</telefonnummer>
        </telefonnumre>
    </person>
    <person>
        <fornavn>Børge</fornavn>
        <efternavn>Børgesen</efternavn>
        <telefonnumre>
            <telefonnummer type='fast'>33333333</telefonnummer>
            <telefonnummer type='mobil'>44444444</telefonnummer>
        </telefonnumre>
    </person>
    <person>
        <fornavn>Carl</fornavn>
        <efternavn>Carlsen</efternavn>
        <telefonnumre>
            <telefonnummer type='fast'>55555555</telefonnummer>
            <telefonnummer type='mobil'>66666666</telefonnummer>
        </telefonnumre>
    </person>
</kartotek>


using System;
using System.Xml;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // construct XML document
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\kartotek.xml");
            // traditional DOM
            XmlNodeList domlist = doc.GetElementsByTagName("person");
            foreach(XmlElement person in domlist)
            {
                Console.WriteLine(person.GetElementsByTagName("fornavn")[0].FirstChild.Value);
                Console.WriteLine(person.GetElementsByTagName("efternavn")[0].FirstChild.Value);
                foreach(XmlElement telefonnummer in person.GetElementsByTagName("telefonnummer"))
                {
                    Console.WriteLine(telefonnummer.Attributes["type"].Value + " " + telefonnummer.FirstChild.Value);
                }
            }
            // XPath
            XmlNodeList xpathlist = doc.SelectNodes("//kartotek/person");
            foreach(XmlElement person in xpathlist)
            {
                Console.WriteLine(person.SelectSingleNode("fornavn").FirstChild.Value);
                Console.WriteLine(person.SelectSingleNode("efternavn").FirstChild.Value);
                foreach(XmlElement telefonnummer in person.SelectNodes("telefonnumre/telefonnummer"))
                {
                    Console.WriteLine(telefonnummer.Attributes["type"].Value + " " + telefonnummer.FirstChild.Value);
                }
            }
            // done
            Console.ReadKey(true);
        }
    }
}
Avatar billede arne_v Ekspert
29. august 2007 - 02:54 #11
og et svar
Avatar billede Kim Neesgaard Seniormester
16. september 2007 - 15:57 #12
Undskyld! Jeres svar havde forputtet sig i min mailbox!
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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