[XML+PHP]XML bestand uitlezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Ik ben sinds gisteravond bezig met een uptime/statistieken script voor m'n webserver hier wat al aardig lukt (zie sig). Een vriend gebruikt het script ook en die kwam op het idee om ook CPU/case temperaturen weer te geven.

Dit wil ik doen via een logbestand van Motherboard monitor 5. Die geeft een XML bestand terug wat er ongeveer zo uitziet:
code:
1
2
3
4
5
6
<MBM_INTERVAL>
<Log Date="23-12-2003" Time="19:17:02" CPU="1532 MHz" T_Case="31º C" 
T_CPU="50º C" T_Sensor_3="0º C" V_Core_0="1,80 V" V_Core_1="0,00 V" 
V_3.3="3,42 V" V_5.00="4,90 V" V_12.00="12,19 V" V_Minus_12.00="0,00 V" 
V_Minus_5.00="0,00 V" F_Fan_1="2743 RPM" F_Fan_2="0 RPM" F_Fan_3="0 RPM"/>
</MBM_INTERVAL>


Ik zit nu al een tijdje te kijken op php.net naar mogelijkheden om dit uit te lezen, maar ik snap er echt niks van! Heb ook op phpfreakz gezocht naar een script dat hiertoe in staat is om daaruit inspiratie op te doen, maar ik snap er nog niks van. Kan iemand me een beetje op weg helpen?

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
op weg naar wat?

tis zo'n simpele xml dat je der amper een xml-parser voor nodig hebt.

anders zou je eventueel gewoon effe naar de manual van php gaan en naar xml functies...

wat heb je geprobeert, etc, etc... ?

Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Ik wil bijvoorbeeld (als het anders moet/kan ook prima) het aantal MHz uit kunnen lezen met
PHP:
1
echo $CPU;

om maar een voorbeeld te noemen. Alleen ik kom er niet uit hoe ik de gegevens uit dit XML bestand kan halen...

edit: regex? :X (ik heb nog geen kaas gegeten van php met XML :( )

edit2: heb effe in de search gespiekt naar 'regex' en zoiets had ik dus ook al in gedachten, alleen ik snap daar dus niets van

[ Voor 48% gewijzigd door Glashelder op 23-12-2003 20:27 ]

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 21:53

Tux

Misschien een regex maken die alle dingen uitleest? Een XML-parser is hier niet nodig.

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
doe dan toch een gewoon een simpele (regex lijkt me iets te ver gevordert voor je (naar aanleiding van je vraag) string search.

dus je laad de xml file (fopen)
lees hem uit naar een string (fread, of what dan ook)
dan zoek je naar CPU=" en dan zet je wat volgt tot de volgende " als je CPU value.

met de xml parser functions krijg je alle attributen ook ineens mee.

Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Dit begint wel heel erg op een script request te lijken maarja, het zoeken naar 'CPU="{waarde}" is m'n probleem juist!

Als ik zo in de PHP manual kijkt dan kom ik van die patronen tegen:
code:
1
([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})
Ik heb er ook een soort van handleiding bij gevonden (hier) maarja dat snap ik dus niet.

edit: ik ben dus eigenlijk te onduidelijk geweest in m'n topicstart :Y)



Ik ben wat aan het knoeien geweest, en ik kom hierop uit:

$CPU = ereg_replace("(CPU=\")([0-9]{4})(")", "\\2", $bestand);

uiteraard werkt dit niet ( :+ ), kan iemand me vertellen waarom? (ongetwijfeld)

ik laat het dus express buiten de php tags, hij haalt m'n slashes weg :/

[ Voor 108% gewijzigd door Glashelder op 23-12-2003 21:27 ]

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
PHP:
1
2
3
4
$string = file_get_contents('mbm.xml');
preg_match("|(\d+).Mhz|si",$string,$matches); 
$cpu = $matches[1];
//print_r($matches);


Zo ff uit het hoofd.

[edit]
Gecontroleerd en dit werkt. $string is de inhoud van het xml bestand.

[edit2]
PHP:
1
2
3
4
5
6
7
8
9
10
echo readXMLAttribute('<Log Date="23-12-2003" Time="19:17:02" CPU="1532 MHz" T_Case="31º C" 
T_CPU="50º C" T_Sensor_3="0º C" V_Core_0="1,80 V" V_Core_1="0,00 V" 
V_3.3="3,42 V" V_5.00="4,90 V" V_12.00="12,19 V" V_Minus_12.00="0,00 V" 
V_Minus_5.00="0,00 V" F_Fan_1="2743 RPM" F_Fan_2="0 RPM" F_Fan_3="0 RPM"/>','F_FAN_1');


function readXMLAttribute($xml,$attribute) {
    preg_match("|".$attribute."=\"(.*?)\"|si",$xml,$matches); 
    return $matches[1];
}


Wauw, ik ben goed 8)

[ Voor 98% gewijzigd door Skaah op 23-12-2003 22:08 ]


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
gebruik gewoon strpos = sneller, leesbaarder.

misschien is er wel iemand die de juiste regex voor je wil vinden ;). Zelf probeer ik het zo min mogelijk te gebruiken vanwege 'too hardcore' ;)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
hobbit_be schreef op 23 december 2003 @ 22:01:
gebruik gewoon strpos = sneller, leesbaarder.

misschien is er wel iemand die de juiste regex voor je wil vinden ;). Zelf probeer ik het zo min mogelijk te gebruiken vanwege 'too hardcore' ;)
Je bedoelt strpos op 'Mhz' of op 'CPU="'? Je weet dan nooit hoeveel tekens daarna je moet capturen.

RegExp-en kunnen dat soort dingen wel. (\d+).

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Skaah schreef op 23 december 2003 @ 22:04:
[...]


Je bedoelt strpos op 'Mhz' of op 'CPU="'? Je weet dan nooit hoeveel tekens daarna je moet capturen.

RegExp-en kunnen dat soort dingen wel. (\d+).
tuurlijk wel :)
je strpos't eerst op bijvoorbeeld "Mhz=", het stuk daarvoor strip je (met substr), dan pak je die string, en strpos je op de ", weer strippen, weer str pos op de ", en dan weer strippen vanaf de positie van de tweede " tot strlen :) sim-pel :P maar of het sneller is, wie weet

[ Voor 10% gewijzigd door PrisonerOfPain op 23-12-2003 22:46 ]


Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Bedankt allemaal voor de reacties, maar ik wil het eigenlijk zelf kunnen.
Kan iemand me dus vertellen wat ik hier fout doe?
PHP:
1
2
3
4
5
$handle = fopen("temps.xml", "r");
$bestand = fread($handle, filesize("temps.xml"));

eregi('CPU="([0-9]{4})" MHz', $bestand, $CPU);
echo $CPU[1];

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

  • Bluestorm
  • Registratie: Januari 2000
  • Laatst online: 20-08-2022
PrisonerOfPain: je hoeft niet steeds die string te verkleinen hoor je kunt gewoon
PHP:
1
2
3
$pos1 = strpos($data,'CPU=');
$pos2 = strpos($data,'"',$pos1);
$result = substr($pos1,$pos2);


doen. of in iedergeval iets wat daar erg op lijkt.

code-zip: wat gaat er fout dan? Die {4} lijkt me trouwens erg naief. Als je een wat tragere computer hebt... of het in de verre toekomst nog wil gebruiken zou dat best eens wat anders kunnen zijn.

[ Voor 35% gewijzigd door Bluestorm op 23-12-2003 22:56 ]

Tenminste... dat [ denk / zie / weet ] ik... | Javascript obfuscator | foto's en video's uploaden


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
je moet een regexp tussen " en " zetten.

Verder tussen twee tekens zoals | en dan kun je na de laatste | je parameters meegeven, zoals s en i.

PHP:
1
eregi("|CPU=\"([0-9]{4})\" Mhz|si",$bestand,$CPU);


Ik weet niet zeker of eregi de volledige RegExp syntax ondersteunde, preg_match doet het wel in ieder geval. Houd er wel rekening mee dat {4} niet werk bij mensen met een kloksnelheid t/m 999 Mhz. Gebruik dan \d{3,4} (tussen 3 of 4 decimalen) of \d+ (minimaal 1 decimaal). \d is hetzelfde als [0-9].

[ Voor 9% gewijzigd door Skaah op 23-12-2003 22:59 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
PrisonerOfPain schreef op 23 december 2003 @ 22:45:
[...]


tuurlijk wel :)
je strpos't eerst op bijvoorbeeld "Mhz=", het stuk daarvoor strip je (met substr), dan pak je die string, en strpos je op de ", weer strippen, weer str pos op de ", en dan weer strippen vanaf de positie van de tweede " tot strlen :) sim-pel :P maar of het sneller is, wie weet
Wat goed gaat, totdat je een \" tegenkomt... maar goed, wat dat betreft is mijn RegExp ook niet helemaal perfect...

Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Skaah schreef op 23 december 2003 @ 22:56:
je moet een regexp tussen " en " zetten.

Verder tussen twee tekens zoals | en dan kun je na de laatste | je parameters meegeven, zoals s en i.

PHP:
1
eregi("|CPU=\"([0-9]{4})\" Mhz|si",$bestand,$CPU);


Ik weet niet zeker of eregi de volledige RegExp syntax ondersteunde, preg_match doet het wel in ieder geval. Houd er wel rekening mee dat {4} niet werk bij mensen met een kloksnelheid t/m 999 Mhz. Gebruik dan \d{3,4} (tussen 3 of 4 decimalen) of \d+ (minimaal 1 decimaal). \d is hetzelfde als [0-9].
Als ik deze zo gebruik:
Warning: eregi(): REG_EMPTY: in C:\Program Files\Apache Group\Apache2\htdocs\uptime\exper.php on line 5
Dat is opgelost als ik deze gebruik:
PHP:
1
eregi("CPU=\"([0-9]{3,4})\" Mhz|si",$bestand,$CPU);

Ik krijg nu dit terug:
Array ( [0] => si [1] => )
Niet wat ik wil eigenlijk, ik wil "1532 MHz" terugkrijgen :)

edit: waarom trouwens Mhz|si?

[ Voor 7% gewijzigd door Glashelder op 23-12-2003 23:15 ]

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

  • mr.inno
  • Registratie: April 2003
  • Laatst online: 14-09 18:19
function readDatabase($filename) {
// read the xml database of aminoacids
$data = implode("",file($filename));
$parser = xml_parser_create();
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
xml_parse_into_struct($parser,$data,$values,$tags);
xml_parser_free($parser);

}

dat is het beginnetje

http://www.php.net/xml_parse_into_struct
kijk daar maar ff voor wat voor array's je terug krijgt.
het is dan heel in voudig.. voor al dat stuk met atributes..
je krijgt gewoon alles in een array

inno


Acties:
  • 0 Henk 'm!

  • Eegee
  • Registratie: Januari 2000
  • Laatst online: 23:35
zoals hobbit_be al aangaf:
http://nl.php.net/manual/nl/ref.xml.php al gezien? xml_parse_into_struct bijvoorbeeld.
* Eegee is weer eens te laat

Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Ja maar nu ik toch bezig ben doe ik het liever met zo'n patroon (als ik die aan de praat krijg :/)..daarnaast snap ik er toch niets van wat er op php.net staat over xml_parse_into_struct ;)


PHP:
1
2
preg_match("|CPU="([0-9]{3,4})" MHz|",$bestand,$CPU);
print_r($CPU);

->
Array ( )
Het kan toch niet ZO moeilijk zijn om gewoon die "1532 MHz" eruit te krijgen? :|


De oplossing!
PHP:
1
preg_match("|CPU=\"([0-9]{3,4} MHz)\"|",$bestand,$CPU);

De oplettende mensen zien dat het m'n eigen stomme fout was :+

[ Voor 86% gewijzigd door Glashelder op 24-12-2003 12:45 ]

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
dual-zip schreef op 23 december 2003 @ 23:28:
Ja maar nu ik toch bezig ben doe ik het liever met zo'n patroon (als ik die aan de praat krijg :/)..daarnaast snap ik er toch niets van wat er op php.net staat over xml_parse_into_struct ;)


PHP:
1
2
preg_match("|CPU="([0-9]{3,4})" MHz|",$bestand,$CPU);
print_r($CPU);

->

[...]

Het kan toch niet ZO moeilijk zijn om gewoon die "1532 MHz" eruit te krijgen? :|


De oplossing!
PHP:
1
preg_match("|CPU=\"([0-9]{3,4} MHz)\"|",$bestand,$CPU);

De oplettende mensen zien dat het m'n eigen stomme fout was :+
$CPU[1] bevat nu 1532, niet 1532Mhz! Ik zie nu dat je Mhz ook captured binnen de haakjes.

De i betekent trouwens: ignore caps
de s staat voor: dot (.) matches any char (niet: newline)

[ Voor 22% gewijzigd door Skaah op 24-12-2003 21:31 ]


Acties:
  • 0 Henk 'm!

  • flexje
  • Registratie: September 2001
  • Laatst online: 21:55

flexje

got-father

PHP:
1
2
3
4
5
6
7
8
9
$inhoud = file("temp.xml"); 
$inhoud = implode("", $inhoud); 

$top1 = explode("CPU=\"",$inhoud); 

$track = explode("\"", $top1[1]);

$temp = $track[0];
echo "$temp";


;)

"Try not to become a man of success but rather to become a man of value..."


Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Mja, het me vannacht nog wat lopen verdiepen in die regual expressions en dat had als resultaat dat ik de rest zelf kon maken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//CASE temperatuur uit XML vissen!

preg_match("|T_Case=\"([0-9]{2}..[0-9]{3}. C)|", $bestand, $temp1);
$case_temperatuur = substr($temp1[1], 0,2);

//V-CORE uit XML-vissen!

preg_match("|V_Core_0=\"([0-9]{1}.[0-9]{2} V)\"|", $bestand, $v);
$V_core = substr($v[1], 0, 4);

//3.3 Volts lijn uit XML-vissen!

preg_match("|V_3.3=\"([0-9]{1}.[0-9]{2} V)\"|", $bestand, $v3);
$volt_33 = substr($v3[1], 0, 4);
$volt_33 = ereg_replace(",", ".", $volt_33);

//5 volts lijn uit XML-vissen!

preg_match("|V_5.00=\"([0-9]{1}.[0-9]{2} V)\"|", $bestand, $v5);
$volt_5 = substr($v5[1], 0, 4);
$volt_5 = ereg_replace(",", ".", $volt_5);

//12 volts lijn uit XML-vissen!

preg_match("|V_12.00=\"([0-9]{2}.[0-9]{2} V)\"|", $bestand, $v12);
$volt_12 = substr($v12[1], 0, 4);
$volt_12 = ereg_replace(",", ".", $volt_12);

//FAN snelheid

preg_match("|F_Fan_1=\"([0-9]{4} RPM)\"|", $bestand, $FAN);
$FAN_snelheid = substr($FAN[1], 0, 4);

//CPU temperatuur uit XML-vissen!

preg_match("|T_CPU=\"([0-9]{2}..[0-9]{3}. C)\"|", $bestand, $CPU_temp);
$CPU_temperatuur = substr($CPU_temp[1], 0, 2);


btw, $CPU[1'] bevat wel degelijk "1532 MHz" ?

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc

Pagina: 1