Löste det själv.
Set Namn = xmlDoc.getElementsByTagName("Name")
if Namn.item(1) is nothing then
response.write "strängen är tom"
else
strNamn1 = Namn.item(1).text
end if
Kör en redirect till en sida som avslutar allt när strängen är tom.
12 svar · 1 282 visningar · startad av Alamartimo
Har problem med att leta igenom info i den här XML filen.
Det är inga problem att få ut enskilda element om jag anger item(0,1 osv)
Filerna nedan fungerar nu som dom är.
Men om jag i exemplet nedan anger Name.item(2) vilket inte finns (finns bara 2 taggar med <Name> så genererar sidan att object inte finns.
Jag ska alltså ha möjligheten att kolla igenom 20st <Name> taggar men om det bara finns ex 12 så stannar den på 13'e.
Så antingen vill jag kolla om objectet finns, om inte så gå vidare till nästa rad och kolla etc så att jag kan gå igenom hela XML-filen efter värden.
Jag vill ha ut värdena från XML filen för att sätta in dom i en MySQL databas.
Tacksam om någon har ett förslag.
Har provat med hjälp av sökning här och försökt få till en if not sats men det vill sig inte.
results.xml
<rFactorXML version="1.0">
<RaceResults>
<TimeString>2006/04/21 21:16:10</TimeString>
<TrackCourse>Donington Park</TrackCourse>
<TrackLength>3948.7</TrackLength>
<RaceLaps>8</RaceLaps>
<Driver>
<Name>Hannu Alamartimo</Name>
<CarType>F3Euro</CarType>
<CarNumber>02</CarNumber>
<TeamName>ASM</TeamName>
<GridPos>15</GridPos>
<Position>16</Position>
<BestLapTime>89.0413</BestLapTime>
<FinishTime>763.1972</FinishTime>
<Laps>7</Laps>
<Pitstops>0</Pitstops>
<FinishStatus>Finished Normally</FinishStatus>
</Driver>
<Driver>
<Name>Rolf Zwolsman</Name>
<CarType>F3Euro</CarType>
<CarNumber>24</CarNumber>
<TeamName>ZWOLSMAN</TeamName>
<GridPos>13</GridPos>
<Position>11</Position>
<BestLapTime>88.6396</BestLapTime>
<FinishTime>751.9550</FinishTime>
<Laps>8</Laps>
<Pitstops>0</Pitstops>
<FinishStatus>Finished Normally</FinishStatus>
</Driver>
Och här är xmltest.asp
Response.ContentType = "text/plain"
set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load (Server.MapPath("results2.xml"))
Dim Dat, Track, Namn, GridPos, Position
Set Dat = xmlDoc.getElementsByTagName("TimeString")
strDat = Fixatecken(Dat.item(0).text)
strDat2 = Left(strDat,10)
Set Track = xmlDoc.getElementsByTagName("TrackCourse")
strTrack = Track.item(0).text
Set Length = xmlDoc.getElementsByTagName("TrackLength")
strLength = Length.item(0).text
strLength2 = Left(strLength,4)
Set Laps = xmlDoc.getElementsByTagName("RaceLaps")
strLaps = Laps.item(0).text
Set CarType = xmlDoc.getElementsByTagName("CarType")
strCarType = CarType.item(0).text
'förarlistan börjar här
Set Namn = xmlDoc.getElementsByTagName("Name")
strNamn1 = Namn.item(0).text
Set CarNumber = xmlDoc.getElementsByTagName("CarNumber")
strCarNumber = CarNumber.item(0).text
Set TeamName = xmlDoc.getElementsByTagName("TeamName")
strTeamName = TeamName.item(0).text
Set GridPos = xmlDoc.getElementsByTagName("GridPos")
strGridPos = GridPos.item(0).text
Set Position = xmlDoc.getElementsByTagName("Position")
strPosition = Position.item(0).text
Set BestLapTime = xmlDoc.getElementsByTagName("BestLapTime")
strBLT = BestLapTime.item(0).text
Set FinishTime = xmlDoc.getElementsByTagName("FinishTime")
strFinishTime = FinishTime.item(0).text
Set Laps2= xmlDoc.getElementsByTagName("Laps")
strLaps2 = Laps2.item(1).text
Set Pits = xmlDoc.getElementsByTagName("Pitstops")
strPits = Pits.item(0).text
Set DF = xmlDoc.getElementsByTagName("FinishStatus")
strDF = DF.item(0).text
''här ska nästa förare listas med item(1)
'Set DNF = xmlDoc.getElementsByTagName("DNFReason")
'strDBF = DNF.item(0).text
Löste det själv.
Set Namn = xmlDoc.getElementsByTagName("Name")
if Namn.item(1) is nothing then
response.write "strängen är tom"
else
strNamn1 = Namn.item(1).text
end if
Kör en redirect till en sida som avslutar allt när strängen är tom.
Ett tips är att använda sig at xpath för att hämta noder ur ett xml-dokument. Ex för att rendera ut driver-data:
Dim node
For Each node in xmlDoc.selectNodes("RaceResults/Driver")
Response.Write GetChildNodeValue(node, "Name") & "<br />"
Response.Write GetChildNodeValue(node, "CarNumber") & "<br />"
Response.Write GetChildNodeValue(node, "TeamName") & "<br />"
Response.Write GetChildNodeValue(node, "CarNumber") & "<br />"
Next
Function GetChildNodeValue(ByRef node, ByVal elementName)
Dim childNode
Set childNode = node.selectSingleNode(elementName)
If childNode Is Nothing then
GetChildNode = ""
Else
GetChildNode = childNode.text
End if
End Function
Här kan du läsa mer om det:
Det där var intressant toha. Tackar (y)
toha skrev:
Ett tips är att använda sig at xpath för att hämta noder ur ett xml-dokument.
Tjena!
Har nappat lite på det där, men har kört fast.
Här är mitt XML Dokument:
<mystats>
<stat>
<datetime>070516</datetime>
<rake>4,1</rake>
<bonus>40,3</bonus>
<currency>USD</currency>
</stat>
<stat>
<datetime>070517</datetime>
<rake>2,43</rake>
<bonus>13,3</bonus>
<currency>USD</currency>
</stat>
<stat>
<datetime>070518</datetime>
<rake>34,43</rake>
<bonus>23,3</bonus>
<currency>USD</currency>
</stat>
<statssum>
<sumrake>326,91</sumrake>
<sumbonus>154,1</sumbonus>
</statssum>
</mystats>
Jag använder följande kod för att få ut data:
Set XMLDoc = CreateObject("MSXML2.DOMDocument")
XMLDoc.setProperty "ServerHTTPRequest", true
XMLDoc.async=false
XMLDoc.Load "http://ADRESSEN.COM/get-stats.asp?account_id=" & global_id & ""
If XMLDoc.parseError.errorCode = 0 Then
Dim node
i = 0
For Each node in XMLDoc.selectNodes("mystats/stat")
If i Mod 2 <> 0 Then row_count = "row-odd" Else row_count = "row-even" End If
Response.Write( "<p class=""col-1 " & row_count & """>" & GetChildNodeValue(node, "datetime") & " </p>" & VbCrLf &_
"<p class=""col-2 " & row_count & """>" & GetChildNodeValue(node, "rake") & " </p>" & VbCrLf &_
"<p class=""col-3 " & row_count & """>" & GetChildNodeValue(node, "bonus") & " </p>" & VbCrLf &_
"<p class=""col-4 " & row_count & """>" & GetChildNodeValue(node, "currency") & " </p>" & VbCrLf &_
"<p class=""clear-all""> </p>" & VbCrLf)
i = i + 1
Next
Response.Write( "<p class=""site-topic-1 row-topic"">Totalt:</p>" & VbCrLf &_
"<p class=""site-topic-2 row-topic"">[b][red]0[/red][/b]</p>" & VbCrLf &_
"<p class=""site-topic-3 row-topic"">[b][red]0[/red][/b]</p>" & VbCrLf &_
"<p class=""site-topic-4 row-topic""> </p>" & VbCrLf &_
"<p class=""clear-all""> </p><br />" & VbCrLf)
Else
Response.write XMLDoc.parseError.reason
End If
Alla rader skrivs ut, utom det som finns inom <statssum> (<sumrake>, <sumbonus>)
Har testat med flera olika saker, men får inte ut dessa två hur jag än gör.
Resultatet ska visas efter For-Loopen, istället för de två, röda nollorna som finns där nu.
Några förslag?
GetChildNodeValue(XMLDoc.selectSingleNode("mystats/statssum"), "sumrake")
Aha, ser intressant ut.
Ska kolla om det funkar det första jag gör när jag kommer till jobbet imorrn.
Tack o Go'natt!
Fungerar hur bra som helst, tack!
Hej igen!
Nu har jag ett XML dokument som är sjukt stort (webbläsaren hänger sig nästan när man ska kolla på filen, ca. 10MB är det på).
Adressen för er som vill kolla på den:
http://admin.octracker.net/fastnet2007.xml
Jag vill nu plcoka ut data om en viss båt, den med ID 420 (<id>420</id>).
Frågan är bara, hur gör jag?
Jag vet hur jag ska göra för att plocka ut allt från filen, men i det här fallet vill jag bara ha just ID420 och det som finns om denna båt.
Några förslag på hur man kan lösa det här?
Tack!
Hmm, aha.
Nu har jag den här koden:
<%
Function GetChildNodeValue(ByRef node, ByVal elementName)
Dim childNode
Set childNode = node.selectSingleNode(elementName)
If childNode Is Nothing then
GetChildNode = "foo"
Else
GetChildNode = childNode.text
End if
End Function
Set XMLDoc = CreateObject("MSXML2.DOMDocument")
XMLDoc.setProperty "ServerHTTPRequest", true
XMLDoc.async=false
XMLDoc.Load "http://admin.octracker.net/fastnet2007.xml"
If XMLDoc.parseError.errorCode = 0 Then
Dim node
For Each node in XMLDoc.selectNodes("/TrackerData/Events/LocationGroups/Locations[ID/text()='420']")
Response.Write(GetChildNodeValue(node, "Name") & "<br />")
Next
Else
Response.write XMLDoc.parseError.reason
End If
%>
Men inget alls returneras...
Har testat att hämta /TrackerData/Events och sen "Name", fast samma där, inget skrivs ut.
Är det något annat fel i koden, eller kan det bero på något annat?
Typiskt... gjorde samma miss som förra gången jag körde funktionen ovan.
Som ni ser heter funktionen "getChildNodeValue" och inte "getChildNode".
:)