webForumDet fria alternativet

Nollställd på xml ...

8 svar · 726 visningar · startad av UrMe

UrMeMedlem sedan apr. 2001762 inlägg
#1

Kan man få ut informationen ur ett .xml dokument som ligger på en annan server? .. alltså detta är .xml filen: http://www.camelot-europe.com/herald/nb_connected.xml

Om vi säger att jag vill ha ut alla <population> går det att göra på nåt sätt? så att varje gång sidan laddas på min server så hämtar den info från den där xml-filen?

Eller måste jag använda php eller asp på nåt sätt?

*En som fattar nada av xml men vill ha ut informationen* :)

jarvkloMedlem sedan juli 20013 378 inlägg
#2

Re: Nollställd på xml ...

UrMe skrev:

Kan man få ut informationen ur ett .xml dokument som ligger på en annan server?

Jupp. De flesta parsers kan hämta information mha en URL...

UrMe skrev:

Om vi säger att jag vill ha ut alla <population> går det att göra på nåt sätt? så att varje gång sidan laddas på min server så hämtar den info från den där xml-filen?

Eller måste jag använda php eller asp på nåt sätt?

Du *kan* använda client-side Javascript + MSXML om du vill, men det rekommenderas *inte* om du inte kan begränsa dig till besökare som kör MSIE6... (visst - det funkar någorlunda i MSIE5 också, men buggarna är fler där !)
Principen för hur du gör framgår av http://www.webforum.nu/showthread.php?s=&threadid=41499

Det är antagligen säkrare att använda PHP eller ASP.
PHP - se t.ex. http://www.phpbuilder.com/columns/joe20000907.php3 (fopen skall kunna öppna filer via http också http://www.php.net/manual/en/function.fopen.php )

ASP - Metoden "load" i MSXMLDOM kan hämta filer över nätet också - även om det kanske är bättre att använda XMLHTTP (sök på xmlhttp i ASP-forumet - där finns *mycket* info! )

Nä du väl hämtat filen kan du antingen hämta informationen programmässigt via t.ex. DOM (speciellt bra om du vill plocka ut värden för vidare bearbetning) eller också kan du transformera utseendet med XSLT om du bara vill visa upp informationen...

UrMeMedlem sedan apr. 2001762 inlägg
#3

Just nu använder jag mig av fopen i php.. och det fungerar väl om man bara vill lista all information rätt upp och ner. Dock har jag lite problem att hämta specifik information.. t.ex bara 2 specifika taggar..

Men det som är målet är att kunna sortera informationen..

Den filen jag använder mig av är: http://www.camelot-europe.com/herald/servers/Excalibur/guilds/147.xml

Och så här långt har jag kommit: http://www.urme.com/fellowship/members.php

Problemet är att jag inte vet hur ska kunna t.ex sortera efter namn etc.

jarvkloMedlem sedan juli 20013 378 inlägg
#4

Ok.
Antar att du kör liknande teknik som i PHPBuilder-exemplet...
Prova att modda characterData(), startelement() och endElement() till att lägga in innehållet för de taggar du är intresserad av i olika globala arrayer i stället för att skapa HTML-taggar direkt.
Sortera sedan dessa parallelt med array_multisort() i den ordning du är intresserad och skapa HTML-koden genom att loopa genom arrayerna när hela parsningen är avslutad... (pust! - finns säkert smartare sätt också ;) )

jarvkloMedlem sedan juli 20013 378 inlägg
#5

Exempel enligt föregående inläggs princip:
Redigerad: Koden visade sig innehålla buggar, se nedan för korrekt kodexempel

UrMeMedlem sedan apr. 2001762 inlägg
#6

Ah.. tackar och bockar! det funkar ju utmärkt! detta kan jag bygga vidare på!

UrMeMedlem sedan apr. 2001762 inlägg
#7

Bara en liten fundering...

Om vi säger att ett namn är "Johan's Hasd" ... då delar han upp det så här:
variabel1 = Johan
variabel2 = '
variabel3 = s Hasd

Hur löser man det på enklaste sättet?

jarvkloMedlem sedan juli 20013 378 inlägg
#8

UrMe och Jag löste det hela efter diskussion i (PHP-) tråden http://www.webforum.nu/showthread.php?s=&threadid=50703

Så här blev den slutliga, fungerande, exempelkoden:

<?php
function startElement($parser, $name, $attrs=''){
    global $current_tag, $current_index, $thenames; 
		    $current_tag = $name;
    switch($name){
        case 'CHARACTER':
		 	$thenames[$current_index]=$attrs['NAME'];
			$current_index+=1;
        break;
        default:
        break;
    }
}
function endElement($parser, $name, $attrs=''){
    global $current_tag, $current_index;
    switch($name){
        case 'RACE':
        case 'CLASS':
        case 'LEVEL':
		    $current_tag = "";
        break;
        default:
        break;
    }
}

function characterData($parser, $data){
    global $current_tag, $current_index, $therace, $theclass, $thelevel;
    switch($current_tag){
        case 'RACE':
			if (isset($therace[$current_index]))  {
				 $therace[$current_index].=$data;
			}
			else {
				 $therace[$current_index]=$data;
			}
		 break;
        case 'CLASS':
			if (isset($theclass[$current_index]))  {
				 $theclass[$current_index].=$data;
			}
			else {
				 $theclass[$current_index]=$data;
			}
		 break;
        case 'LEVEL':
			if (isset($thelevel[$current_index]))  {
				 $thelevel[$current_index].=$data;
			}
			else {
				 $thelevel[$current_index]=$data;
			}
		 break;
    default:
        break;
    }
}

$xml_file = 'http://www.camelot-europe.com/herald/servers/Excalibur/guilds/147.xml';
$type = 'UTF-8';
$xml_parser = xml_parser_create($type);
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
xml_set_element_handler($xml_parser, 'startElement','endElement');
xml_set_character_data_handler($xml_parser, 'characterData');

if (!($fp = fopen($xml_file, 'r'))) {
    die("Could not open $xml_file for parsing!\n");
}

$current_index=0;
while ($data = fread($fp, 4096)) {
    if (!($data = utf8_encode($data))) {
        echo 'ERROR'."\n";
    }
	if (!xml_parse($xml_parser, $data, feof($fp))) {
  		die("XML error".xml_error_string(xml_get_error_code($xml_parser)));
	}
}
xml_parser_free($xml_parser);

array_multisort ($thenames, SORT_STRING, $therace, $theclass, $thelevel);
 
echo '<table border="1">';
foreach ( $thenames as $key => $value ) {
	echo "<tr>";
	echo "<th align='left'>$value</th>";
	echo "<td>$therace[$key]</td>";
	echo "<td>$theclass[$key]</td>";
	echo "<td>$thelevel[$key]</td>";
	echo "</tr>\n";
}
echo'</table>';
?>
fredrik99Medlem sedan maj 2000426 inlägg
#9

Fel postat, sorry :)

132 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)