05. januar 2015 - 10:15 Der er 7 kommentarer og
1 løsning

PHP og XMLREADER //

HEJ,

Har en XML-fil :
<xml ..... >
- <tandlege_hansen>
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  .....
- <tandlege_hansen>

og i PHP'en gør jeg følgende:


<?php

$reader = new XMLReader();

if (!$reader->open("data.xml"))
{
    die("Failed to open 'data.xml'");
}
....
?>

masse html-kode

<?php
    while ($reader->read())
    {
        if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'data')
        {
          $var1 = $reader->getAttribute('var1');
          $var2 = $reader->getAttribute('var2');
          $var3 = $reader->getAttribute('var3');
          .....
          ?>
          masse HTML-kode
         
          <?php
        }
    }
   
$reader->close();

?>
Dette her fungerer optimalt.

Nu ønsker tandlege_hansen at hans XML fil ser ud som følgende:

<xml ..... >
- <tandlege_hansen>
  <uge_1>
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  .....

Antal <data .. > kan variere fra 1 til 64 uafhængig af uge_nummer.

  </uge1>
  <uge_2>
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  .....
  </uge2>
 
  ....

  <uge_48>
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  .....
  </uge48>
  ......
  <uge_52>
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  <data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
  .....
  </uge52>
<tandlege_hansen>

Spørgsmålet er nu:

    while ($reader->read())
    {

et eller andet sted her skal jeg læse </UGE_XX> (min CAP. markering) - udtrække UGE-nummeret, sammenligne med aktuelle UGE-Nummer og positionere XML-reader til aktuelle uge- læse data - vise dem og afslutte reader.... (og visning)

        if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'data')

og hvordan gør jeg det ?


Kristian
Avatar billede arne_v Ekspert
05. januar 2015 - 21:20 #1
Er de XML filer saa store at det virkeligt er noedvendigt at bruge XMLReader?
06. januar 2015 - 00:20 #2
Hej,

Som du vel kan regne ud er det en del af et TANDLÆGE-booking system.

Tandlægen er (relativ) nyetableret (= stor gæld) og vil derfor arbejde meget for at nedbringe denne. Hver dag fra 08:00 til 24:00 (ikke spør mig hvorfor) og med 15 minutters konsultationer.

Det giver en tabel på 8 søjler (TIDSøjle , MANDAG .. SØNDAG) og fra 08:00 - 24:00 i 15 minutters segmenter (læs: konsultationer) . Dette giver en tabel på 8 * 64 celler.

På hver celle skal jeg kunne sætte TEKST, font, fontstørrelse, tekstfarve, og baggrundsfarve.

al ala:  <td width ="xxpx" valign="middle" align="center" <?php echo($baggrundsfarve) ?> <font face="<?php echo($font) ?>" color= <?php echo($tekstcolor) ?>"> size="<?php echo($textsize) ?>"><?php echo($TEKST) ?></font>/TD>

det betyder at hver celle har ca. 5 php variable og med 8 celler pr. line = 40 php variable.

Disse 40 variable skal hentes fra førnævnte XML fil. gerne via XMLreader...  (som pt er den eneste løsning jeg har fået til at virke tilfredsstillende)

for 64 celler * 8 søjer * 5 XML-variable * 52 uger = ???

JO DET BLIR EN STOR XML-fil.

Det er tanken at selve XML-filen genereres lokalt (hos tandlægen) , FTP*es til server, (gamle XML-filer slettes umiddelbart før) og dermed opdateres web-siden.

Og dette er kun en del af projektet...

Men hvis der er andre (og/eller  bedre) løsninger er jeg meget stærkt interesseret.

Kristian
Avatar billede olsensweb.dk Ekspert
06. januar 2015 - 20:32 #3
jeg har ikke lige regnet på filstørrelsen af den fil du kommer til at anvende, men prøv dette eks, gerne med en af tandlægens filer.
var1 - var64 kan jo have forskællig længde
hvor maget fylder en af tandlægens xml filer ??


test
data.xml
     
<?xml version="1.0" encoding="UTF-8"?>
<tandlege_hansen>
<uge_1><data var1 = "bla" var2="blabla" var3 ="blablabla" /><data var1 = "bla" var2="blabla" var3 ="blablabla" /><data var1 = "bla" var2="blabla" var3 ="blablabla" /></uge_1>
<uge_2><data var1 = "bla" var2="blabla" var3 ="blablabla" /><data var1 = "bla" var2="blabla" var3 ="blablabla" /><data var1 = "bla" var2="blabla" var3 ="blablabla" /></uge_2>
<uge_48><data var1 = "bla" var2="blabla" var3 ="blablabla" /><data var1 = "bla" var2="blabla" var3 ="blablabla" /><data var1 = "bla" var2="blabla" var3 ="blablabla" /></uge_48>
<uge_52><data var1 = "bla" var2="blabla" var3 ="blablabla" /><data var1 = "bla" var2="blabla" var3 ="blablabla" /><data var1 = "bla" var2="blabla" var3 ="blablabla" /></uge_52>
</tandlege_hansen>
   

php code
     
<?php
$xml=simplexml_load_file("data.xml") or die("Error: Cannot create object");
foreach ($xml as $key => $value){
    echo $key; // uge_x
    echo "\n<br>";
    // print_r($value);   
    $data = $value->data;
    // print_r($data);
    $att = $data->attributes();
    echo $att['var1'];
    echo "\n<br>";
    echo $att['var2'];
    echo "\n<br>";
    echo $att['var3'];
    echo "\n<br>";
}
?>
   

På hver celle skal jeg kunne sætte TEKST, font, fontstørrelse, tekstfarve, og baggrundsfarve.
<font face="

hvorfor styler du ikke dette i et css style sheet, istedet for inline style

Men hvis der er andre (og/eller  bedre) løsninger er jeg meget stærkt interesseret.
som alternativ format kunne du overveje JSON, istedet for XML, men dette er op til tandlægen om han kan gemme som JSON
JSON fylder mindre end tilsvarende XML, og er ide'elt ifm AJAX, men også godt til PHP
06. januar 2015 - 23:19 #4
til ronols

Mange 1000 tak for det løsningsforslag. Det virker umiddelbart som en bedre løsning end brug af XML-reader (for (som jeg tror) jeg kan afbryde LOOP'et når perioden er i uge XX (og ikke som XML-rdr hvor du skal scanne hele file = ressource-spild og cp-tid spild.)

Tandlægen vil fra sin hjemmetabel // enten en EXCEL-tabel eller noget tilsvarende // kunne styre hver enkelt celle (font, font-størrelse etc. ) via XML-tabellen. Derfor valgte jeg umiddelbart  den løsning.

(så vidt jeg er orienteret er CSS statisk (kan dog loades via filer - men alligevel statisk), men jeg kan fornemme at her ligger en mulighed ??? (hehe) )

Tandlægen ved intet om teknisk EDB (programmering etc), udover at han kan bruge det og da jeg begyndte at snakke om HTML, PHP, CSS, JavaScript, FTP osv., så han både morsom og forkert ud i ansigtet. Så jeg tror det klogeste er at holde sig til en for ham nem løsning. (uden alt for mange gimmics''' ). 

Jeg vil i morgen (onsdag) prøve din løsning - min mavefølelse siger det vil være løsningen - og melde tilbage.

Kr
06. januar 2015 - 23:19 #5
DAMN, kom til at sætte mig selv som pointmodtager- det er forkert.
Avatar billede arne_v Ekspert
07. januar 2015 - 04:12 #6
I denne sammenhaeng er:

ikke stort = kan vaere i memory

stort = kan ikke vaere i memory

Og graensen der er vel et eller andetsted i 100 MB til 1 GB.

Jeg er 99.999% sikker paa at din XML fil ikke er saa stor.

XMLReader er rigtigt godt naar man skal laese en XML fil der er for stor til at vaere i memory.

Men det er et ret primitivt API, saa hvis XML filen vaere i memory, saa er det normalt bedre.
07. januar 2015 - 09:02 #7
HEJ,

Har nu prøvet SIMPLE-XML løsningen.

Det ER vejen fremad omend der pt. er nogen hængepartier.

Har nu følgende kode:

$source = 'data2.xml';
//
// data2.xml er en kopi af data.xml  (beholder org-filen som
// basis)
//

$xml = new SimpleXMLElement($source,null,true) or die("Error: Cannot create object");
//
// Den med
// $xml = SimpleXML_load_file(...); gir mig en syntaksfejl uanset // hvad jeg prøver,. men ovennævnte virker. (syntaksen her kan
// være ukorrekt ! )
//

foreach ($xml as $key => $value)
{
    echo $key; // uge_x
    echo "\n<br>";                      // print_r($value);   
    $data = $value->data;              // print_r($data);
    $att = $data->attributes(); //  as $att;
   
    echo 'var1 = '.$att['var1'].'<BR>';
    echo 'var2 = '.$att['var2'].'<BR>';
    echo 'var3 = '.$att['var3'].'<BR>';
}

?>

Koden virker perfekt, men viser kun EEN linie. (linie 1)

eks:

<xml ...
<tandlege_hansen>
<uge_01>
  <data var1="bla" ..... />  // Linie 1
  <data var1="bla" ..... />  // linie 2
  ....
</uge_01>
<uge_02>
...
</tandlege_hansen>


Jeg prøvede så at lægge en foreach ( ) ind.

Det gik ikke godt:

.....

    $data = $value->data;              // print_r($data);
//  $att = $data->attributes();        //  as $att;
   
Bruger jeg denne får jeg vist ALLE Linier men uden data (altså alle valX = '' (tomme data)

    foreach ($data->attributes() as $att)
    { 
      echo 'var1 = '.$att['var1'].'<BR>'; ---> ingen data
      echo 'var2 = '.$att['var2'].'<BR>'; ---> Ingen data
      echo 'var3 = '.$att['var3'].'<BR>'; ---> Ingen data
    }   

og bruger jeg

  foreach ($att as $data->attributes() )

får jeg en syntaksfejl ...

og bruger jeg
    foreach ($data->attributes as $att)

får jeg en tom skærm....


Kan en af jer fortælle mig hvad det er jeg gør forkert :

Kr
31. januar 2015 - 00:58 #8
OK,

Fik det hele til at køre efter en masse eksperimenter og (lige så meget bøvl).  Og har ikke hørt noget i lang tid. Så jeg lukker det her spm.

Hvis nogen af svarerne føler sig forbigået. send mig en mail.
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

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