10. juli 2003 - 08:50Der er
32 kommentarer og 1 løsning
Hente fra XML
jeg har en xlm fil der ser sådan her ud: <?xml version="1.0" encoding="iso-8859-1" ?> - <qstat> - <server type="MAS" address="1.0.0.127" status="UP"> <hostname>testhost</hostname> <name>test</name> <gametype>Team</gametype> <map>map1</map> <numplayers>12</numplayers> <maxplayers>12</maxplayers> <ping>78</ping> <retries>0</retries> - <rules> <rule name="location">1</rule> <rule name="gamever">2</rule> <rule name="gamename">xxxx</rule> <rule name="pure">0</rule> <rule name="realism">1</rule> <rule name="sprinton">0</rule> <rule name="dedicated">1</rule> <rule name="gametype_i">2</rule> <rule name="gamemode">openplaying</rule> <rule name="gametype">Team-Match</rule> <rule name="hostport">203</rule> <rule name="fraglimit">0</rule> <rule name="timelimit">20</rule> </rules> - <players> - <player> <name>spiller1</name> <score>82</score> <ping>53</ping> <team>0</team> <skin /> <mesh /> <face /> </player> </players> </server> </qstat> og et asp script: <% Dim xml Set xml = Server.CreateObject("Microsoft.XMLDOM") xml.async = False xml.load(Server.MapPath("page.xml"))
Dim root Set root = xml.documentElement
%> <html> <head> <title>Example 3</title> </head> <body> <h1> All People In File</h1> <table border=1> <tr><th>Name</th><th>Phone</th><th>Address</th></tr> <% Dim nameNode, hostname, name, gametype, thisChild For I = 0 TO (root.childNodes.length - 1) Set thisChild = root.childNodes(I) hostname = thisChild.childNodes(0).Text name = thisChild.childNodes(1).Text gametype = thisChild.childNodes(2).Text %> <tr><td><% =hostname %></td><td><% =name %></td><td><% =gametype %></td></tr> <% Next %> </table> </body> </html>
men hvordan henter jeg en "player" ind og det som høre til , har prøvet at skrive mange ting men enten henter det ALT ind i en line, eller også kan jeg kun hente date fra ROOT
Jamen hvis jeg har f.eks 12 spiller og det under så ville jeg jo gerne kunne hente alle spiller ind på en "pæn" række Hvad mener du med selectSingleNode("./some_x_path").text , hvordan skal den skrives? har prøvet at sætte child players ind flere steder men får fejl
fra <server type="MAS" address="1.0.0.127" status="UP"> og det under kan jeg hente det hele, men når jeg prøver at få data fra - <rules> eller - <players> går det galt
Ok - her er et eksempel mtil en liste af spillere, der skulle virke til dit XML:
<% Dim xml Set xml = Server.CreateObject("Msxml2.DOMDocument") xml.async = False xml.load(Server.MapPath("page.xml"))
Dim root Set root = xml.documentElement
%> <html> <head> <title>Example 3</title> </head> <body> <h1> All People In File</h1> <table border=1> <tr><th>Name</th><th>Phone</th><th>Address</th></tr> <% Dim nameNode, hostname, name, gametype, thisChild, oServer
set oPlayers = root.selectNodes("//server/players/player")
For i = 0 TO (oPlayers.length - 1) Set thisChild = oPlayers(i) name = thisChild.selectSingleNode("name").text %> <tr><td><% =name %></td></tr> <% Next %>
Der kan være enkelte småfejl, da jeg normalt skriver serverside i javascript syntax.
Generelt syntes jeg du skulle gennemgå nogle tutorials (f.eks http://www.w3schools.com/) omkring xml og xslt, for at komme ind i f.eks xpath håndteringen.
Data som f.eks. hostname lægger sig op af <server> noden, derfor skal du, hvis du ønsker nogle ting herfra selectere fra den, f.eks root.selectSingleNode("//server/hostname").text - hvor "//server" betyder at du tager den første server node der stødes på set ud fra root noden. Sætningen kan du sætte ind i dit eksempel og så skulle det virke.
Det kommer an på, vil du have fat i alle rules eller en bestem af dem?
"name" er en attribut og ikke en del af navnet "rule" du kan søge ud på den enkelte rule's ved at specificere hvad deres attributter skal indeholde, f.eks root.selctsingleNode("//rules/rule[name='location']") (der nok lige et pronblem i VBScript omkring pling (" og ') problematikken).
<table border=1> <tr><th>gamever</th><th>type</th><th>type2</th></tr> <% Dim nameNode, thisChild, oRules
set oRules = root.selectNodes("//rules/rule[name='gamever']") For I = 0 TO (oRules.length - 1) Set thisChild = oRules(I) name = thisChild.selectSingleNode("gamever").text
Faktisk på samme måde som med players. Prøv om ikke dette virker?
set oRules = root.selectNodes("//server/rules/rule")
For i = 0 TO (oRules.length - 1) Set thisChild = oRules(i) name = thisChild.getAttribute("name"); value = thisChild.text %> <tr><td><% =name %></td><td><% =value %></td></tr>
Error Type: Microsoft VBScript compilation (0x800A0401) Expected end of statement /smart/xml/showxml.asp, line 41, column 38 svarende til name = thisChild.getAttribute("name");
Det kan man helt sikkert også - xml kan næsten alt! Jeg har nok bare ikke forstået hvad du vil helt - kan du evt. ikke prøve at forklare det lidt nærmere? (såsom hvad du f.eks ger vil have fat i, og hvornår du vil have fat i det osv.)
Jo det er så ret nemt, f.eks. istedet for at hente hele rules så bare en af de her: <rule name="location">1</rule> <rule name="gamever">2</rule> <rule name="gamename">xxxx</rule> <rule name="pure">0</rule> <rule name="realism">1</rule> <rule name="sprinton">0</rule> <rule name="dedicated">1</rule> <rule name="gametype_i">2</rule> <rule name="gamemode">openplaying</rule> <rule name="gametype">Team-Match</rule> <rule name="hostport">203</rule> <rule name="fraglimit">0</rule> <rule name="timelimit">20</rule>
det vil give dig "gamever", men forudsætter at du ved hvilken "name" du vil have fat i, hvis du blot vil have skrevet alle rules ud i en pæn tabel skal du gøre sådan som jeg skrev "10/07-2003 11:10:52".
Når man skal pille enkelte data ud fra en node er det (næsten altid) "selectSingleNode". Hvis det er en attribut skal man efterfølgende benytte "getAttribute" (man kan faktisk godt bruge selectSingleNode til dette også). Hvis det er en hel samling af noder er det selectNodes.
Somsagt er hele nøglen til at kunne drible rundt i et xml-dokument at man ved hvordan "xpath" fungerer, derfor læs nogle tutorials omkring dette!
PS. Jeg bliver lidt i tvivl omkring de der "plinger" - min VBScript egenskaber er lidt rusten lige her, i JavaScript vill man skrive root.selectSingleNode("//server/rules/rule[@name='gamever']").text
JavaScript eller VBScript - er vist smag og behag, og jeg er vant til at benytte JavaScript ... så for mig er det lige til, men andre kan meget vel syntes det omvendte :-) Notationen er næsten det samme.
Der er ikke den store forskel på JavaScript (bemærk det ikke er Java) og VBScript.
Faktisk på samme måde som med players. Prøv om ikke dette virker?
Men her her er et java script:
var oRules = root.selectNodes("//server/rules/rule");
for (var i = 0; i < oRules.length; i++) { var thisChild = oRules(i) name = thisChild.getAttribute("name"); value = thisChild.text; %> <tr><td><% =name %></td><td><% =value %></td></tr> <% } %>
Næ det har du ret i når man ser det, men det skal jo lige laves så det passe ind i en html side først. Jeg tror jeg holder mig til det som jeg har fået ti l at virke :)
Mht. xmlhtp så giver det vist lidt problemer, da set thisChild = root.selectNodes("//server" jo statig peger på lokal ikke ? jeg indsatte bare <% Set objXMLHTTP = Server.CreateObject("Microsoft.XMLHTTP") Set objXMLDOM = Server.CreateObject("Microsoft.XMLDOM") objXMLDOM.async = false Call objXMLHTTP.Open("GET", "http://xxx.dk/page.xml", False) objXMLHTTP.Send Set objXMLDOM = objXMLHTTP.ResponseXML Set root = objXMLDOM.documentElement %>
Ihverfald kan jeg ikke få det til at virke, men SKAL nok prøve selv, ellers må jeg jo vende tilbage :)
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.