webForumDet fria alternativet

Läsa av en XML fil med ASP

ASP

9 svar · 580 visningar · startad av Alamartimo

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

Jaha då var man där igen..

Missade ett scenario och nu funkar inte scriptet. :e ja det är så det är.

I alla fall så kan det i kodsnutten under saknar <Taggar> så som BestLapTime och FinishTime och då fungerar det inte med att köra getElementsByTagName("BestLapTime") med item(0), item(1) etc. för när dessta taggar inte finns med så blir ordningen på det som petas in i databasen fel.

För att förklara mig mer.

Namn1 - BestLapTime1.item(0)
Namn2 - BestLapTime2.Item(1)

(och här då så saknas BestLapTime3 för förare 3 med Namn3)
Namn3 -

(här skulle item(3) vara men då det saknades info vid item(2) så blir värdet här item(2) istället)
Namn4 - BestLapTime4.item(2)

Delar av raceresult.xml

<Driver>
<Name>Hannu Alamartimo</Name>
<CarType>Megane</CarType>
<CarNumber>13</CarNumber>
<TeamName>RSDG</TeamName>
<GridPos>1</GridPos>
<Position>20</Position>
<Laps>0</Laps>
<Pitstops>0</Pitstops>
<FinishStatus>DNF</FinishStatus>
<DNFReason>DNF</DNFReason>
</Driver>

<Driver>
<Name>Pedro Petiz</Name>
<CarType>Megane</CarType>
<CarNumber>8</CarNumber>
<TeamName>Oregon Team</TeamName>
<GridPos>2</GridPos>
<Position>1</Position>
[B]<BestLapTime>54.5765</BestLapTime>
<FinishTime>139.6144</FinishTime>[/B]
<Laps>2</Laps>
<Pitstops>0</Pitstops>
<FinishStatus>Finished Normally</FinishStatus>
</Driver>

Och här är delar av scriptet:

Set BestLapTime1 = xmlDoc.getElementsByTagName("BestLapTime")
if BestLapTime1.item(0) is nothing then
strBestLap1 = "999.999"
else
strBestLap1 = BestLapTime1.item(0).text
end if

' här körs en insert i databasen

Set BestLapTime2 = xmlDoc.getElementsByTagName("BestLapTime")
if BestLapTime2.item(1) is nothing then
strBestLap2 = "999.999"
else
strBestLap2 = BestLapTime2.item(1).text
end if

' här körs en insert i databasen

Klurar säkert ut det men om någon har tips så är det välkommet..

Har hållt på med det i några dagar nu utan något bra resultat..

Tack på förhand :)

Medlem sedan dec. 19996 721 inlägg
#2

Förklara gärna vad själva funktionen ska göra, och bifoga en XML-fil. Det ser ut som att du är inne på fel spår. T.ex. så kör du xmlDoc.getElementsByTagName("BestLapTime") två gånger. Den kommer ju att returnera samma sak båda gångerna, så en gång räcker.

Medlem sedan okt. 2004129 inlägg
#3

Tja jag loopar inte xmlDoc.getElementsByTagName("BestLapTime")

Utan jag plockar ut värdena med item(0) för första <taggen> BestLapTime i filen
och sen med item(1) för andra <taggen> med BestLapTime som den hittar.

Så långt funkar det om det är så att <Taggen> <BestLapTime> finns för varje förare. Men den kan alltså saknas och då blir det fel ordning på item().

Det är mer info jag plockar ut men de uppgifterna finns alltid med så att säga.

Vad jag vill med allt är att läsa ut info (inte allt) för varje förare (totalt 20st, kan vara färre än så men max 20 förare) mellan <Driver> </Driver>och skriva inte det i en databas.

Har försökt med många olika varianter och exempel från DevGuru men jag får felmeddelanden hela tiden "Object Required". Vet inte om det är så att *xml filen är felaktigt byggd men det är ett pc-spel som genererar den så tja.
Koden ovan var den som fungerade för mig.
Kör MS 2003 server, IIS6.0 och MySQL.

Bifogar hela xml filen som textfil.

EDIT: det bästa vore ju så klart att loopa fram allt mellan <Driver></Driver> för varje förare och peta in i databasen men jag fick inte till det och drog då därför ut dem med item() innan jag upptäckte att det kan vara så att vissa taggar saknas ibland och då faller ju allt.

Men jag fortsätter här så länge :)

Medlem sedan okt. 2004129 inlägg
#4

Inser att det här inte kommer att funka så bra och letade därför upp ett program som plockar ut infon jag behöver och skapar en HTML fil istället som redan är formaterad med den relevanta datan jag behöver.

Nu måste jag bara läsa ut datan ur html filen, ta bort allt skräp så jag har texten kvar och peta in det i en databas... Nya problemlösningar :e

Medlem sedan dec. 19996 721 inlägg
#5

Nä, gör inte så! Om du har datan väl strukturerad i ett XML-dokument så är det galet att sabba den strukturen genom att göra om det till HTML först.

XML-filen var helt ok.

Vad jag vill med allt är att läsa ut info (inte allt) för varje förare (totalt 20st, kan vara färre än så men max 20 förare) mellan <Driver> </Driver>och skriva inte det i en databas.

Med andra ord så ska du loopa över alla Driver-element (med GetElementsByTagName eller SelectNodes) och inne i den loopen hämta ut de värden som behövs och stoppa in dem i databasen.

Medlem sedan okt. 2004129 inlägg
#6

Ja mitt andra alternativ var ju inte helt enkelt det heller :D

Med andra ord så ska du loopa över alla Driver-element (med GetElementsByTagName eller SelectNodes) och inne i den loopen hämta ut de värden som behövs och stoppa in dem i databasen.

Japp det stämmer bra..

Som sagt så funkade allt bra när alla <Taggar> som jag listade ut fanns med i xml filen.
Men när det sen saknades 2 <Taggar> i xml filen i Elementet -Drivers (<BestLapTime> och <FinishTime>) så försköts all info och fel värden hamnade på fel Driver i databasen pga att jag använde mig av item(0), item(1) osv.

Den grejen hämtar ju den första posten med värdet jag är ute efter och blir ju inte alls rätt i exemplet längst upp på sidan.

Medlem sedan dec. 19996 721 inlägg
#7

Just därför ska du loopa över Drivers-elementen och inte hoppa på BestLapTime direkt.

for each driverNode in xmlDoc.SelectNodes("//Driver")

	response.write "Namn:" & GetValue(driverNode,"Name","") & "<BR>"
	response.write "Bästa varvtid:" & GetValue(driverNode,"BestLapTime","0")
	response.write "<hr>"

next

function GetValue(xmlNode,nodeName,defaultValue)
	set subNode=xmlNode.SelectSingleNode(nodeName)
	if not subNode is nothing then
		GetValue=subNode.text
		exit function
	end if
	GetValue=defaultValue
end function
Medlem sedan okt. 2004129 inlägg
#8

Ahhh grymt.. :birp

Om jag har fattat det rätt så är det alltså funktionen som kollar Alla Elementen <Driver> för att se vilka noder som finns. Därefter försöker vi få tag i dom noderna som vi angett tidigare och finns dom inte så sätts 0 i dess ställe.

Är jag fel på det då?

Vill så gärna förstå det här också..

Tusen tack :)

Medlem sedan dec. 19996 721 inlägg
#9

For Each-loopen hämtar ut alla Driver-element. GetValue-funktionen letar upp en undernod och returnerar dess innehåll. Om det inte hittas returneras det värde man skickar in i defaultValue.

Medlem sedan okt. 2004129 inlägg
#10

Då förstår jag.. Toppen (y)

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