Avatar billede gascon Nybegynder
13. marts 2003 - 09:53 Der er 17 kommentarer og
1 løsning

læsning af xml fil

Jeg har behov for at læse denne xml fil med VB

Hvordan gør man det  ????

<?xml version="1.0"?>
<Printer_Info>

<Printer Name="HP45_1">
    <IP_Adr>192.168.1.12</IP_Adr>
    <Bygning>1. afd.</Bygning>
    <Placering>Hovedbygning</Placering>
    <Server>SRV03-ol</Server>
</Printer>
<Printer Name="HP45_2">
    <IP_Adr>192.168.1.12</IP_Adr>
    <Bygning>1. afd.</Bygning>
    <Placering>Hovedbygning</Placering>
    <Server>SRV03-ol</Server>
</Printer>
<Printer Name="HP45_3">
    <IP_Adr>192.168.1.12</IP_Adr>
    <Bygning>1. afd.</Bygning>
    <Placering>Hovedbygning</Placering>
    <Server>SRV03-ol</Server>
</Printer>
</Printer_Info>
Avatar billede ocp Nybegynder
13. marts 2003 - 10:00 #1
Jeg smuttede lige ind hos microsoft:

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q263247

Public Function RecordsetFromXMLString(sXML As String) As Recordset

    Dim oStream As ADODB.Stream
    Set oStream = New ADODB.Stream
   
    oStream.Open
    oStream.WriteText sXML  'Give the XML string to the ADO Stream

    oStream.Position = 0    'Set the stream position to the start

    Dim oRecordset As ADODB.Recordset
    Set oRecordset = New ADODB.Recordset
     
    oRecordset.Open oStream    'Open a recordset from the stream

    oStream.Close
    Set oStream = Nothing

    Set RecordsetFromXMLString = oRecordset  'Return the recordset

    Set oRecordset = Nothing

End Function
Avatar billede medions Nybegynder
13. marts 2003 - 10:03 #2
Avatar billede gascon Nybegynder
13. marts 2003 - 10:33 #3
Jeg går i stå med denne fejl i denne linie.

Set objXMLHTTP = Server.CreateObject("Microsoft.XMLHTTP")

er det en component eller andet jeg skal bruge...

/gert
Avatar billede ocp Nybegynder
13. marts 2003 - 10:39 #4
Hvis du vælger medions løsning skal du have installeret MSXML. Vælger du min skal du have ADO 2.7.
Avatar billede gascon Nybegynder
13. marts 2003 - 11:10 #5
Kan man lokke noget kode ud af jer, som bruger min xml fil...
'

Gert
Avatar billede sagdjb Nybegynder
14. marts 2003 - 11:40 #6
Hvis du arbejder med XML skal du bruge en parser, til at parse XML'et. Og da du arbejder i VB, vil jeg regne med at du skal benytte MSXML (som følger med i en version 1,2,3 eller 4 - alle undtagen version 1, hedder MSXML2).

Loader du fil fra VB:
Dim parser as new MSXML2.DomDocument
parser.async = false
parser.load "c:\somewhere\min_fil.xml"

eller hvis du har det i en tekst-streng:
Dim parser as new MSXML2.DomDocument
parser.async = false
parser.loadXML "<a>mitdata</a>"

Gør du det fra ASP, skal du huske at sætte serverHTTPrequest property til TRUE. Når du først har parset dit xml har du alle DOM muligheder:
msgbox parser.documentelement.nodename
msgbox parser.selectSingleElement("<xpath>").nodevalue

Test for fejl med:
if parser.parseError then msgbox parser.parseError.reason
Avatar billede gascon Nybegynder
17. marts 2003 - 09:06 #7
msgbox parser.selectSingleElement("<xpath>").nodevalue

Kan jeg ikke lige få til at virke, hvorfor ikke  ??????
Avatar billede sagdjb Nybegynder
17. marts 2003 - 09:25 #8
<xpath> skal selvfølgeligt skiftes ud med valid XPath f.eks. //Printer eller /Printer_Info/Printer[@Name="HP45_1"] osv. Se på www.w3c.org for at finde ud af hvad man kan med xpath.

En anden ting er at en tekst node, hænger på en node, derfor skal du benytter firstChild før nodevalue (Hvis din xpath peger på en node). Når du benytter msxml kan du bruge text istedet for nodevalue, den viser alle de textnoder der er under selve noden. f.eks. msgbox parser.selectSingleElement("/Printer_Info/Printer[@Name='HP45_1']/IP_Adr").text skriver ip-adressen ud på den printer der hedder hp45_1.
Avatar billede gascon Nybegynder
17. marts 2003 - 09:41 #9
Den melder fejl på selectSingleElement metode or data member not found


Dim Parser As New MSXML2.DOMDocument
Set Parser = CreateObject("MSXML2.DomDocument.3.0")
Parser.async = False
Parser.Load "U:\Udvikling\Applikationer\Nyt Printerprogram\printere.xml"
If Parser.parseError Then MsgBox Parser.parseError.reason

Set rootelement = Parser.documentElement
Set printerlist = Parser.getElementsByTagName("Server")
MsgBox Parser.documentElement.nodeName

MsgBox Parser.selectSingleElement("/Printer_Info/Printer[@Name='HP45_1']/IP_Adr")

 
End
End Sub
Avatar billede sagdjb Nybegynder
17. marts 2003 - 09:47 #10
Med Parser.selectSingleElement("/Printer_Info/Printer[@Name='HP45_1']/IP_Adr") får du jo en IP_Adr node med ud. Den har ingen værdi i sig selv. Tekstnoden under den har dog en værdi!! -Hvis du ønsker at skrive et eller andet ud, kan du på samme måde som du gør ovenover, skrive nodename ud ... eller benytte text for at få værdien ud.

f.eks.
MsgBox Parser.selectSingleElement("/Printer_Info/Printer[@Name='HP45_1']/IP_Adr").nodeName

eller

MsgBox Parser.selectSingleElement("/Printer_Info/Printer[@Name='HP45_1']/IP_Adr").text
Avatar billede gascon Nybegynder
17. marts 2003 - 09:59 #11
det er selve komandoen  selectSingleElement den melder fejl på.
den findes slet ikke, jeg har en selectSingleNode.

Gert
Avatar billede sagdjb Nybegynder
17. marts 2003 - 10:12 #12
Undskyld den hedder selectSingleNode, den er desværre ikke en del af DOM recommendation så den virker ikke i andre parsere end msxml. Og da jeg koder mest Java kan sådanne detaljer jo smutte :-)

/Jacob
Avatar billede gascon Nybegynder
17. marts 2003 - 10:31 #13
Så er den på plads,
kan man søge på et printernavn og få det ud men tilhørende underpunkter

Gert
Avatar billede sagdjb Nybegynder
17. marts 2003 - 10:41 #14
Jeg er ikke sikker på hvad du spørger om, men hvis du vil udskrive alle de tags der er under kan du skrive:

msgbox Parser.selectSingleNode("/Printer_Info/Printer[@Name='HP45_1']").xml

Hvis du kun vil have printernavnet:

msgbox Parser.selectSingleNode("/Printer_Info/Printer").Attributes.getNamedItem("Name").text

Du skal huske på at det er XML, så du kan altid få fat i de elementer der ligger under den node du har fat i på nuværende tidspunkt.
f.eks.

minNode = Parser.selectSingleNode("/Printer_Info/Printer")
msgbox minNode.Attributes.getNamedItem("Name").text
for each child in nimNode.childNodes
  msgbox child.text
next

osv.

/Jacob
Avatar billede gascon Nybegynder
17. marts 2003 - 14:21 #15
skal minNode så ikke dimmes på en eller anden måde....

som du ser er de 200 hjemme....
Avatar billede sagdjb Nybegynder
17. marts 2003 - 14:26 #16
jo hvis du kører med option explicit i VB... ellers kan du dimme den til:

Dim minNode As MSXML2.IXMLDOMNode

Så får du lookup's!!

/Jacob
Avatar billede gascon Nybegynder
17. marts 2003 - 14:31 #17
hvad skal nimnode så settes til...

set minNode = ????
Avatar billede sagdjb Nybegynder
17. marts 2003 - 15:06 #18
jo som alle andre objekter skal den sættes f.eks.

Dim minNode As MSXML2.IXMLDOMNode
set minNode = Parser.selectSingleNode("/Printer_Info/Printer")

nu bliver minNode til DOMNoden printer, og du kan herefter arbejde med den..!!
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
Kurser inden for grundlæggende programmering

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