10. november 2008 - 21:20Der er
12 kommentarer og 1 løsning
Problem med at få værdier vha VBS
Jeg har nedenstående struktur, men synes ikke jeg kan få det til at virke. Set Nodtriggerrecords = Xdoc.documentelement.selectsinglenode("/Triggertags/triggertag[@name='Maksimum temperature R10000 1']/Triggerrecords/triggerrecord")
Jeg får at vide: "Object required" Jeg har prøvet at skrive strengen ud, for at tjekke at det ser rigtigt ud. Det gør det, men alligevel vil det ikke virke for mig.
Set doc = CreateObject("Microsoft.XMLDOM") doc.Async = False doc.Load("trigger.xml") Set ttag = doc.SelectSingleNode("//triggertags/triggertag[@name='Maksimum temperature R10000 1']") Set trrecs = ttag.NextSibling t = trrecs.SelectSingleNode("//triggerrecords/triggerrecord/@time").Text v = trrecs.SelectSingleNode("//triggerrecords/triggerrecord/@value").Text WScript.Echo t & " " & v Set trrecs = Nothing Set ttag = Nothing Set doc = Nothing
Hvilken linie fejler den i (hvad står der i linien)? Du skal sikre dig at xdoc er initieret. Hvis din XPath ikke returnere noget burde den objektvariabel du tildeler noden blot indeholde nothing og ikke give en runtimefejl.
Du burde kunne bruge den XPath du angiver, dog skal du være opmærksom på at node-tags er case sensitive, så Triggerrecords og triggerrecords er IKKE det samme!
Du burdu kunne gøre dette:
Set Nodtriggerrecords = Xdoc.documentelement.selectsinglenode("/triggertags/triggertag[@name='Maksimum temperature R10000 1']/triggerrecords/triggerrecord") if not Nodtriggerrecords is nothing then sTime = Nodtriggerrecords.getAttribute("time") sValue = Nodtriggerrecords.getAttribute("value") WScript.Echo sTime & ": " & sValue else WScript.Echo "Elementet findes ikke." end if
En anden ting du skal være opmærksom på er, at dobbelt skråstreg (//) søger i hele strukturen efter triggertags, hvilket kan have indflydelse på performance i en stor struktur, så hvis du kan referere nodes absolut eller relativt, er det bedre for performance.
arne_v Din løsning giver mig nogle værdier, men desværre kun for den første entry. Altså indeholder min "value" 133 for alle records.
softspot Den metode du skriver, var faktisk det jeg prøvede i førete omgang. At der er er sneget sig et stort T ind er en tastebørge, og ikke årsagen.
Jeg prøver lige og vise jer hele baduljen:
set objOutputFileMes = objFileSys.CreateTextFile(exportFileNameMes,TRUE) set nodTriggerGroups = xdoc.documentelement.selectnodes("/batch/snapshot/triggers/trigger/triggergroups/triggergroup")
'Writes header in file' objOutputFileMes.Writeline(CreateHeader(ID)) objOutputFileMes.WRITELINE("Name,Type,LSL,USL,Actual,Time")
for each nodTriggerGroup in nodTriggerGroups TriggerGroupName = nodTriggerGroup.getattribute("name") 'objOutputFileMes.Writeline(TriggerGroupName) set nodTriggerTags = xdoc.documentelement.selectnodes("/batch/snapshot/triggers/trigger/triggergroups/triggergroup[@name='" & TriggerGroupName & "']/triggertags/triggertag")
for each nodTriggerTag in nodTriggerTags TriggerTagName = nodTriggerTag.getattribute("name") if not TriggerTagName = "" then TriggerUnit = nodTriggerTag.getattribute("unit") TriggerLSL = nodtriggertag.getattribute("lower_limit") TriggerUSL = nodtriggertag.getattribute("upper_limit") 'TriggerDec = nodtriggertag.getattribute("decimals")' if TriggerLSL = 0 and TriggerUSL = 0 then TriggerLSL = "" TriggerUSL = "" 'else ' TriggerLSL = Round(TriggerLSL,TriggerDec) ' TriggerUSL = Round(TriggerUSL,TriggerDec) end if
Jeg ved det kan være RET forvirrende og se, men har da vist fået set mig blind på hvad der er galt
Hvor jeg bruger den del arne_v gav mig:
set objOutputFileMes = objFileSys.CreateTextFile(exportFileNameMes,TRUE) set nodTriggerGroups = xdoc.documentelement.selectnodes("/batch/snapshot/triggers/trigger/triggergroups/triggergroup")
'Writes header in file' objOutputFileMes.Writeline(CreateHeader(ID)) objOutputFileMes.WRITELINE("Name,Type,LSL,USL,Actual,Time")
for each nodTriggerGroup in nodTriggerGroups TriggerGroupName = nodTriggerGroup.getattribute("name") 'objOutputFileMes.Writeline(TriggerGroupName) set nodTriggerTags = xdoc.documentelement.selectnodes("/batch/snapshot/triggers/trigger/triggergroups/triggergroup[@name='" & TriggerGroupName & "']/triggertags/triggertag")
for each nodTriggerTag in nodTriggerTags TriggerTagName = nodTriggerTag.getattribute("name") if not TriggerTagName = "" then TriggerUnit = nodTriggerTag.getattribute("unit") TriggerLSL = nodtriggertag.getattribute("lower_limit") TriggerUSL = nodtriggertag.getattribute("upper_limit") 'TriggerDec = nodtriggertag.getattribute("decimals")' if TriggerLSL = 0 and TriggerUSL = 0 then TriggerLSL = "" TriggerUSL = "" 'else ' TriggerLSL = Round(TriggerLSL,TriggerDec) ' TriggerUSL = Round(TriggerUSL,TriggerDec) end if
Hvis jeg kunne blive mere skaldet, blev jeg det nu.
softspot Det er da lykkedes mig og få det meste til at virke. Hvad angår time & value, har jeg ikke haft held til det med den metode du beskriver.
Set nodTriggerRecords = nodTriggerTag.selectSingleNode("triggerrecords/triggerrecord") TriggerActual = nodTriggerRecords.getAttribute("value") TriggerTime = nodTriggerRecords.getAttribute("time")
Giver mig den fejl jeg startede ud med. bruger jeg "//triggerrecords/triggerrecord" Får jeg kun indholdet af den første record. Manglende forståelse af hvordan XML-håndteres kan selvfølgelig skyldes mit manglende held.
Fordømt! Jeg havde ikke bemærket at triggerrecords ikke lå inde i triggertag-elementet, men i stedet er sidestillet med triggertag (det var indrykningen i XML-data der snød mig :-)).
Så skal jeg lige forstå hvad du har til hensigt, for der er umiddelbart ikke nogen garanteret orden i elementer i en XML-fil, så du kan ikke med sikkerhed forvente at det næste element efter et triggertag-element er et triggerrecords-element. Derfor skal der være noget som relaterer et triggerrecords-element til et triggertag-element for at du kan sikre den korrekte sammenhæng...
jamen, så kan du benytte nodTriggerTag.nextsibling til at finde det efterfølgende triggerrecords-element og derfra læse time og value på firstChild. I kort genvejsform sådan:
with nodTriggerTag.nextsibling.firstChild TriggerTime = .getAttribute("time") TriggerActual = .getAttribute("value") end with
Dog er denne metode noget usikker, da du ikke lægger noget tjek ind for den situation, hvor nextsibling ikke eksisterer eller at firstChild på nextSibling ikke eksisterer for den sags skyld. Du kan dog sagtens splitte den op, så du kan tjekke om nextSibling er nothing inden du aflæser firstChild og så fremdeles... (en simpel if, hvis du skulle være i tvivl):
if not nodTriggerTag.nextsibling is nothing then if not nodTriggerTag.nextsibling.firstChild is nothing then with nodTriggerTag.nextsibling.firstChild TriggerTime = .getAttribute("time") TriggerActual = .getAttribute("value") end with end if end if
Det skal så ind i stedet for dette kode:
Set nodTriggerRecords = nodTriggerTag.selectSingleNode("triggerrecords/triggerrecord") TriggerActual = nodTriggerRecords.getAttribute("value") TriggerTime = nodTriggerRecords.getAttribute("time")
Nu må jeg bare håbe, at jeg også begynder og fatte noget omkring det her XML. Du kender ikke tilfældigvis en god side hvor der er en forklaring hvordan tingene hænger sammen ?
Hmm... det er vel ikke så meget XML som det er XPath der er udfordringen... eller hvad?
Jeg har selv lært noget ved at læse om XPath i et par bøger, samt bruge det i praksis, så mine primære opslag går mest ud på at få opfrisket de funktioner jeg kan bruge (der er nu ikke så mange endda). Derfor er mit opslagsværk mest baseret på MSDN og flg. links indeholder da noget om XML og XPath:
m.fl., men ligeså snart du får åbnet MSDN, kan du sagtens finde flere atikler og referencematerialer, hvis du kigger dig lidt omkring, eller bare søger...
Tak for point :)
Synes godt om
Ny brugerNybegynder
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.