webForumDet fria alternativet

Leta igenom XML med ASP och få ut dom i sträng

ASP

12 svar · 1 282 visningar · startad av Alamartimo

Medlem sedan okt. 2004129 inlägg
Frågan#1

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
Medlem sedan okt. 2004129 inlägg
#2

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.

Medlem sedan dec. 1999707 inlägg
#3

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
Medlem sedan dec. 1999707 inlägg
Medlem sedan okt. 2004129 inlägg
#5

Det där var intressant toha. Tackar (y)

Medlem sedan feb. 20034 441 inlägg
#6

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") & "&nbsp;</p>" & VbCrLf &_
				"<p class=""col-2 " & row_count & """>" & GetChildNodeValue(node, "rake") & "&nbsp;</p>" & VbCrLf &_
				"<p class=""col-3 " & row_count & """>" & GetChildNodeValue(node, "bonus") & "&nbsp;</p>" & VbCrLf &_
				"<p class=""col-4 " & row_count & """>" & GetChildNodeValue(node, "currency") & "&nbsp;</p>" & VbCrLf &_
				"<p class=""clear-all"">&nbsp;</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"">&nbsp;</p>" & VbCrLf &_
			"<p class=""clear-all"">&nbsp;</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?

Medlem sedan dec. 19996 721 inlägg
#7
GetChildNodeValue(XMLDoc.selectSingleNode("mystats/statssum"), "sumrake")
Medlem sedan feb. 20034 441 inlägg
#8

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!

Medlem sedan feb. 20034 441 inlägg
#9

Fungerar hur bra som helst, tack!

Medlem sedan feb. 20034 441 inlägg
#10

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!

Medlem sedan dec. 19996 721 inlägg
#11

XPathen är:

"/TrackerData/Events/LocationGroups/Locations[ID/text()='420']"

Medlem sedan feb. 20034 441 inlägg
#12

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?

Medlem sedan feb. 20034 441 inlägg
#13

Typiskt... gjorde samma miss som förra gången jag körde funktionen ovan.
Som ni ser heter funktionen "getChildNodeValue" och inte "getChildNode".

:)

265 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)