Autor Zpráva
Prochy
Profil
Ahoj,

už delší dobou mě trápí, že mi funguje vyhledávání Nodu jinak na serveru (7.0.19, Linux) a jinak na localhostu (PHP 7.0.29, Windows). Nejlepší to uvedu na příkladu:
Mám dejme tomu tento kód:

<tr class="po7 kapitanFalse">                             
  <td class="center first" style="width: 10px">9</td>                             <td>                                 
    <div>                                 
      František Cecvárek
      <span style="float:right">Z
      </span>                                    
      <div style="clear:both;">
      </div>                                 
    </div>                                                              </td>                             
  <td class="center" style="width: 90px">12345678</td>                             
  <td class="center" style="width: 25px;text-align:center;">26</td>                             
  <td class="center" style="width: 25px;text-align:center;"></td>                             
  <td class="center" style="width: 25px;text-align:center;"></td>                             
  <td class="center" style="width: 25px;text-align:center;"></td>                             
  <td class="center" style="width: 25px;text-align:center;"></td>                             
  <td class="center last" style="width: 25px;text-align:center;"></td>                         
</tr>

K hlavnímu tr řádku se dostanu následovně:
$element = $finder->query("/html/body/form/div[2]/div[2]/table[3]/tr/td[1]/table/tr[" . $i++ . "]")->item(0);

Pak to parsuji následovně:
$childNodes = $element->childNodes;            
if (isset($players[$childNodes->item(4)->nodeValue]))
.
.
.

A tady už je problém, jelikož pokuď chci vytáhnout číslo "12345678" na serveru, tak je správně $childNodes->item(4), pokud na localhostu tak $childNodes->item(5). Prostě to je posunutý o 1.
Může mi někdo vysvětlit, kde může být problém? Nechce se mi věřit, že chyba bude v odlišné verzi a taky se mi nechce věřit, že by za to mohl jiný OS, ale nic jiného mě nenapadá.
Je to celkem problematický, když potřebuji něco ladit na localhostu a otestovat si nově napsaný kód, jelikož mi to chodí chybu, právě kvůli této prapodivné odlišnosti.

Děkuji za rady.
juriad
Profil
Hádám, že za to můžou bílé znaky mezi elementy. Přesnou příčinu zjistíš, když si vypíšeš všechny nody v řádku spolu s jejich typem a přesným obsahem (například do textarea). V ukázce, kterou jsi dal je to skutečně item(5):
<tr class="po7 kapitanFalse">                             
  <td class="center first" style="width: 10px">9</td>                             <td>                                 
    <div>                                 
      František Cecvárek
      <span style="float:right">Z
      </span>                                    
      <div style="clear:both;">
      </div>                                 
    </div>                                                              </td>                             
  <td class="center" style="width: 90px">12345678</td>                             
  <td class="center" style="width: 25px;text-align:center;">26</td>                             
  <td class="center" style="width: 25px;text-align:center;"></td>                             
  <td class="center" style="width: 25px;text-align:center;"></td>                             
  <td class="center" style="width: 25px;text-align:center;"></td>                             
  <td class="center" style="width: 25px;text-align:center;"></td>                             
  <td class="center last" style="width: 25px;text-align:center;"></td>                         
</tr>

childNodes obsahuje nejen DOMElement, ale i DOMText nody. Ty tebe nezajímají. Zkus se jich nějak zbavit:
* například načti dokument s preserveWhiteSpace=false,
* hledej jinak: $element->getElementsByTagName('td')->item(2),
* použij další xpath dotaz: $finder->query('./td[2]', $element)->item(2), či $finder->query('./td')->item(2),
* rozšiř existující query: $finder->query("/html/body/form/div[2]/div[2]/table[3]/tr/td[1]/table/tr[" . $i++ . "]/td[2]")->item(0)

Už to, že musíš používat čísla 4 nebo 5, když se jedná o buňku s indexem 2 je podezřelé.
Prochy
Profil
Děkuji, ráno se na to podívám. Divné ale je to, že ten text se v ničem neliší, zkopíruji ho tam ze schránky jak na localhost tak na server a na tom localhostu mi to zahlásí problém. Asi tam je něco jinak nastaveno u PHP verze, jinak si to neumím vysvětlit.

Ale souhlasím, že ty indexy mi trochu lámaly hlavu, že to je takhle "chybně" číslované.

Tak jsem to v rychlosti jen vyzkoušel a to s tím getElementsByTagName funguje, tak jak bych si představoval. 0 = 1. buňka, 3 = 3. buňka atd. je přesně to, jak bych to očekával, že se to bude chovat.

Ještě jednou díky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: