Pobieranie danych z XML do kodu php

0

witam,
mam problem z poprawnym pobraniem danych z xml do php. Komórki sa numerowane i niepoprawnie wyświetla się w moim kodzie adres mail.

 <Table ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
    <Column ss:Index="2" ss:StyleID="s74" ss:AutoFitWidth="0" ss:Width="29.25"/>
    <Column ss:StyleID="s74" ss:AutoFitWidth="0" ss:Width="192"/>
    <Column ss:StyleID="s115" ss:AutoFitWidth="0" ss:Width="194.25"/>
    <Column ss:AutoFitWidth="0" ss:Width="69.75"/>
    <Row ss:Height="15">
    <Cell ss:Index="2" ss:StyleID="s166">
    <Data ss:Type="String">Nr</Data>
    </Cell>
    <Cell ss:StyleID="s166">
    <Data ss:Type="String">email</Data>
    </Cell>
    <Cell ss:StyleID="s166">
    <Data ss:Type="String">Alias</Data>
    </Cell>
    </Row>
    <Row>
    <Cell ss:Index="2" ss:StyleID="s90">
    <Data ss:Type="Number">1</Data>
    <Cell ss:StyleID="s118">
    <Data ss:Type="String">adam</Data>
    </Cell>
    <Cell ss:StyleID="s104"/>
    </Row>
    <Row>
    <Cell ss:Index="4" ss:StyleID="s122" ss:HRef="mailto:[email protected]">
    <Data ss:Type="String">[email protected]</Data>
    </Cell>
    </Row>
    <Row>
    <Cell ss:Index="4" ss:StyleID="s122" ss:HRef="mailto:[email protected]">...</Cell>
    </Row>
    <Row>
    <Cell ss:Index="4" ss:StyleID="s122" ss:HRef="mailto:[email protected]">
    <Data ss:Type="String">[email protected]</Data>
    </Cell>
    </Row>
    <Row>
    <Cell ss:Index="4" ss:StyleID="s122" ss:HRef="mailto:[email protected]">
    <Data ss:Type="String">[email protected]</Data>
    </Cell>
    </Row>
    <Row>
    <Cell ss:Index="4" ss:StyleID="s123"/>  
    </Row>
    </Row> 

Kod php:

<?php
$dom = new DomDocument();
$dom -> load("mail.xml");
$data = $dom->getElementsByTagName('Data'); 
echo( "<table><tr>");
$n = 0;
foreach($data as $node)
{ 
    if($n % 3 == 0) { echo '<tr>'; }
    echo( "<td>". $node -> textContent . "<td>");
    if(++$n % 3 == 0) { echo '</tr>'; }
}
echo( "</tr></table>");

?> 
0

niepoprawnie to znaczy jak?

0

Adresy email powinny być w kolumnie jeden pod drugim - a nie są.

0

To się pisze, że nie wyświetla się nic.

"źle się wyświetla" - nie mówi nic
"chcę, żeby wyświetlało się X" - lepiej, ale wciąż nie odpowiada na zadane pytanie !
"wyświetla się Y" (w tym wypadku - nie wyświetla się nic) jest lepsze

Druga rzecz - NIE WYCISZAJ OSTRZEŻEŃ.

Pisz kod tak, żeby nie powodować wyświetlania ostrzeżeń (tj. na produkcji nie wyświetlaj, ale LOGUJ do pliku), a nie pisz kod byle jak, ignoruj błędy, a potem pytasz czego kod PHP nie działa na rozwalonym XML-u....

Warning: DOMDocument::loadXML(): Opening and ending tag mismatch: Cell line 17 and Row in Entity, line: 23 in C:\htdocs\test.php on line 52

0

Ten XML to tylko wycinek - dla bezpieczeństwa danych nie wklejałem tu całego kodu.

Kod php pobiera dane z pliku xml, ale jest problem z wyświetlaniem.
Powinno być:
Nr mail alias
1 adam [email protected]
[email protected]
[email protected]
[email protected]

A wyświetla się:
Nr mail alias
1 adam [email protected]
[email protected] [email protected] [email protected]

0

albo wklejaj kod, którym dal się zreprodukować błąd, albo nie wklejaj nic (ale wtedy też post nie nadaje się do niczego poza koszem)..

wklej coś, czym normalnie da się powtórzyć ten błąd, żeby wszystko było czytelne i jasne.
(xml też możesz sformatować)

0

Oto działający kod XML:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
          xmlns:o="urn:schemas-microsoft-com:office:office"
          xmlns:x="urn:schemas-microsoft-com:office:excel"
          xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
          xmlns:html="http://www.w3.org/TR/REC-html40">

<Worksheet ss:Name="Użytkownicy">
    <Table ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
        <Column ss:Index="2" ss:StyleID="s74" ss:AutoFitWidth="0" ss:Width="29.25"/>
        <Column ss:StyleID="s74" ss:AutoFitWidth="0" ss:Width="192"/>
        <Column ss:StyleID="s115" ss:AutoFitWidth="0" ss:Width="194.25"/>
        <Column ss:AutoFitWidth="0" ss:Width="69.75"/>
        <Row ss:Height="15">
            <Cell ss:Index="2" ss:StyleID="s166"><Data ss:Type="String">Nr</Data></Cell>
            <Cell ss:StyleID="s166"><Data ss:Type="String">Konto email</Data></Cell>
            <Cell ss:StyleID="s166"><Data ss:Type="String">Aliasy</Data></Cell>
        </Row>
                <Row>
            <Cell ss:Index="2" ss:StyleID="s90"><Data ss:Type="Number">1</Data></Cell>
            <Cell ss:StyleID="s118"><Data ss:Type="String">adam</Data></Cell>
            <Cell ss:StyleID="s104"/>
        </Row>
                <Row>
            <Cell ss:Index="4" ss:StyleID="s122" ss:HRef="mailto:[email protected]"><Data ss:Type="String">[email protected]</Data></Cell>
        </Row>
                <Row>
            <Cell ss:Index="4" ss:StyleID="s122" ss:HRef="mailto:[email protected]"><Data ss:Type="String">[email protected]</Data></Cell>
        </Row>
                <Row>
            <Cell ss:Index="4" ss:StyleID="s122" ss:HRef="mailto:[email protected]"><Data ss:Type="String">[email protected]</Data></Cell>
        </Row>
                <Row>
            <Cell ss:Index="4" ss:StyleID="s122" ss:HRef="mailto:[email protected]"><Data ss:Type="String">[email protected]</Data></Cell>
        </Row>
                <Row>
            <Cell ss:Index="4" ss:StyleID="s123"/>
        </Row>
 
 
            </Table>
   </Worksheet>
</Workbook>
0

Nie chcę Cię martwić, ale Twój kod działa poprawnie. Wyciągasz wszystkie elementy Data, a następnie wyświetlasz je w kolejnych komórkach tabeli.
Problemem w tym przypadku nie jest sam kod tylko to, że źle do tego podszedłeś. Jak wygląda gałąź Wokrsheet -> Table? W całej gałęzi są wrzuceni wszyscy użytkownicy, czy dla każdego jest oddzielna gałąź Table?

0

Jest jedna gałąź Table i tam są wrzuceni wszyscy użytkownicy.

1

W takim razie będziesz musiał znaleźć jakiś sposób, aby rozpoznać, w którym momencie zaczyna się informacja o nowym użytkowniku. Adresy e-mail zamiast zapisywać każdy w osobnej komórce możesz umieścić w jednej i rozdzielić je nową linią. W tedy w momencie jak rozpoznasz, że zaczynają się informacje o nowym użytkowniku zamykasz aktualny wiersz i otwierasz nowy.

0

Zmieniłem trochę kod php i teraz kończy mi wyświetlanie na "[email protected]". Pewno ma to związek, że ten <Row> ma tylko jedną <Cell>, ale nie wiem jak to ominąć - próbowałem sprawdzać czy<cell> istnieje przez empty(), ale nie działa. Ma ktoś może jakiś pomysł?

 <?php
$xmldata=simplexml_load_file('new.xml');
$rows=count($xmldata->Worksheet[0]->Table->Row);
$columns=count($xmldata->Worksheet[0]->Table->Row[0]->Cell);
for ($row=0;$row<$rows;$row++)
  {
    for ($column=0;$column<$columns;$column++)
     {
       $zmienna=$xmldata->Worksheet[0]->Table->Row[$row]->Cell[$column]->attributes('ss',TRUE);
      //    echo $zmienna['StyleID'].'<br>';
 	            
      
         if ($zmienna['StyleID']=='s166'){
		$a = $xmldata->Worksheet[0]->Table->Row[$row]->Cell[$column]->Data;
                 echo $a.'<br>';
            } 
 
         elseif($zmienna['StyleID']=='s90'){
		$b = $xmldata->Worksheet[0]->Table->Row[$row]->Cell[$column]->Data;
              echo $b.'<br>';
              } 

        elseif($zmienna['StyleID']=='s118'){
		$c = $xmldata->Worksheet[0]->Table->Row[$row]->Cell[$column]->Data;
              echo $c.'<br>';
              } 

         elseif($zmienna['StyleID']=='s122'){
                  $d = $xmldata->Worksheet[0]->Table->Row[$row]->Cell[$column]->Data;
                 echo $d.'<br>';
                     
                }    
         else {
               echo " ".'<br>';
              }
       
     }
  }


?>

2

Pobierasz liczbę kolumn z pierwszego elementu Row, czyli 3 i nigdzie później tego nie aktualizujesz, aż dziw, że błędami nie rzuca.
Spróbuj w ten sposób:

$xml = simplexml_load_file('test.xml');

$rows = $xml->Worksheet[0]->Table->Row;

foreach($rows as $row)
{
    foreach($row->Cell as $cell)
    {
        $zmienna = $cell->attributes('ss', true);
        ...
    }
}
0

Dziękuje serdecznie za pomoc - udało się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1