Avatar billede toppus Nybegynder
10. juli 2003 - 08:50 Der 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
Avatar billede toppus Nybegynder
10. juli 2003 - 08:52 #1
jeg kan heller ikke hente fra "rules"
Avatar billede arentoft Nybegynder
10. juli 2003 - 09:01 #2
Hvilken del af det er det du ønsker at loope over?

Generelt skal du benytte selectSingleNode("./some_x_path").text hvis du skal have en enkelt værdi ud af dit dokument.
Avatar billede toppus Nybegynder
10. juli 2003 - 09:07 #3
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
Avatar billede toppus Nybegynder
10. juli 2003 - 09:08 #4
da navnet NAVN findes under root og under spiller så henter den kun det fra root af
Avatar billede toppus Nybegynder
10. juli 2003 - 09:10 #5
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
Avatar billede arentoft Nybegynder
10. juli 2003 - 09:18 #6
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.
Avatar billede arentoft Nybegynder
10. juli 2003 - 09:20 #7
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.
Avatar billede toppus Nybegynder
10. juli 2003 - 09:28 #8
kanon det virkede, men hvis jeg stadig vil hente data fra f.eks hostname og players og rules skal jeg så lave :

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>

for hver child??
Avatar billede toppus Nybegynder
10. juli 2003 - 09:29 #9
jeg har læst meget, men har ikke kunne finde et eksempel på hvordan man henter fra flere child på en gang
Avatar billede toppus Nybegynder
10. juli 2003 - 09:32 #10
og det der oserver er det et navn du selv finder på lige som [i] er noget man selv kan ændre på ?
Avatar billede arentoft Nybegynder
10. juli 2003 - 09:50 #11
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.

I det hele taget kan man rigtig meget hvis man forstår xpath, så kig f.eks. på http://www.w3schools.com/xpath/xpath_examples.asp - her er en masse godbidder man kan lære en masse af.

oServer var vist en fejl i "Dim" sætningen, der skulle have stået oPlayers og det er selvfølgelig et navn jeg selv finder på, ligesom [i].

Håber du får meget nytte ud af xml, det har jeg ;-)
Avatar billede toppus Nybegynder
10. juli 2003 - 10:02 #12
KANON det gav mig lige det som jeg skulle bruge

Tak for hjælpen
Avatar billede arentoft Nybegynder
10. juli 2003 - 10:04 #13
Det var så lidt ... tak for points :-)
Avatar billede toppus Nybegynder
10. juli 2003 - 10:14 #14
ups!! bare lige hurtig hvordan henter jeg fra rules  syntes ikke jeg kan  da navnet er skilt ad  "rule name" er det så ikke singelnode ???
Avatar billede arentoft Nybegynder
10. juli 2003 - 10:35 #15
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).
Avatar billede toppus Nybegynder
10. juli 2003 - 10:51 #16
Hmmm kan ikke få det til at virke, hvordan henter jeg hele rules, er det mere simpel??
Avatar billede toppus Nybegynder
10. juli 2003 - 11:10 #17
Hvad er der galt her!!!!!!!!!!!!

<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
     
%>
<tr><td><% =name %>&nbsp;</td></tr>
<% Next %>
Avatar billede arentoft Nybegynder
10. juli 2003 - 11:10 #18
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>
Avatar billede toppus Nybegynder
10. juli 2003 - 11:27 #19
Error Type:
Microsoft VBScript compilation (0x800A0401)
Expected end of statement
/smart/xml/showxml.asp, line 41, column 38
svarende til name = thisChild.getAttribute("name");
Avatar billede toppus Nybegynder
10. juli 2003 - 11:30 #20
Ups der var bare et ; for meget  takker for ALT din hjælp

problembarn
Avatar billede arentoft Nybegynder
10. juli 2003 - 11:33 #21
My mistake - jeg benytter som tidliger sagt mest JavaScript ... så det var vist en lille ups'er :-)

Spiller det ellers nu?
Avatar billede toppus Nybegynder
10. juli 2003 - 11:38 #22
Ja det gør det jeg får alle data ud men er lidt ked af man ikke kan  pille enkelte data ud fra "rules", men det må jeg prøver at læse mig frem til
Avatar billede arentoft Nybegynder
10. juli 2003 - 11:41 #23
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.)
Avatar billede toppus Nybegynder
10. juli 2003 - 12:08 #24
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>
Avatar billede arentoft Nybegynder
10. juli 2003 - 12:18 #25
Det gør du sådan her:

root.selectSingleNode("//server/rules/rule[@name=""gamever""]").text

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!
Avatar billede arentoft Nybegynder
10. juli 2003 - 12:20 #26
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
Avatar billede toppus Nybegynder
10. juli 2003 - 12:50 #27
Sige mig lige en ting!syntes du det er lige til at gå til i et javascript??
er måden "næsten" det samme ??
Avatar billede arentoft Nybegynder
10. juli 2003 - 12:52 #28
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.
Avatar billede toppus Nybegynder
10. juli 2003 - 12:57 #29
kunne du skrive et hurtigt script hvvor det bare henter rules. ??
Hvis du vil ha' flere point så er jeg meget villig

ps. kan man hente xml fra et andet site?
Avatar billede arentoft Nybegynder
10. juli 2003 - 13:00 #30
Troede du havde fået det til at virke med rules?? Jeg forstår ikke hvad det er du vil have hentet??

Hvis du skal hente xml fra et andet site skal du benytte xmlhttp objectet - søg selv på google, eller her på Eksperten.
Avatar billede toppus Nybegynder
10. juli 2003 - 13:26 #31
Jojo  alt virker fint med rules :)  , det jeg ville se, var en bid af et java, når det skulle hente rules eller players eller.... :)  bare for sjovt
Avatar billede arentoft Nybegynder
10. juli 2003 - 13:29 #32
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>
<% } %>

Som du ser ikke den store forskel! :-)
Avatar billede toppus Nybegynder
10. juli 2003 - 13:56 #33
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 :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester