Autor Zpráva
iiic
Profil
Ahoj… název tématu je asi mírně zmatený, ale jde mi o tohle…

Všechny třídy/funkce pracující s DOM-em se mi moc líbí, člověk se to naučí jednou a pak to může používat napřít programovacími jazyky (teoreticky). V praxi jsou tam pak drobné otravné rozdíly jako ten který bych rád nějak vyřešil s (interní) PHP třídou \DOMDocument .

Je tam nějaká metoda, či možnost, jak se zbavit textových nodů bez obsahu?

Protože

<ul>
      <li>obsah</li>
</ul>

tohle `ul` má 2 potomky (prázdný textový node a element li)
a

<ul><li>obsah</li></ul>

tohle ul má jednoho potomka (element li)

a je to tak v pořádku, jen prostě mě v 99.9% případů prázdné textové nody nezajímají a tak v javascriptu když pracuji s domem mám 2 různé funkce .childNodes a .children, kde ta druhá v pořadí (.children) vrátí všechny nody, které nejsou textové. Je něco takového i v PHP? Pokud vím, tak je tam jen metoda childNodes, obdoba té javascriptové .childNodes.

Ještě mě napadlo nějak projít celý obsah objektu \DOMDocument-u či jeho \DOMElement-u a vyházet všechny prázdné textové nody, ale moc nevím jak na to a ani jestli je to správné řešení.

Poradíte někdo prosím ?
Keeehi
Profil
Ty mezery se dají "vyházet" velmi lehce.
$xmlDoc = new DOMDocument();
$xmlDoc->preserveWhiteSpace = false;

Případně prázdné textové body se neobjevují, pokud budeš iterovat pomocí foru a metody $element->item($i)
iiic
Profil
Keeehi:

Nevím jestli nedělám něco špatně, ale tohle mi prostě nefunguje :(

<?php

$content = '<ul id="a"><li>obsah</li> </ul>';

$dom = new \DOMDocument;
$dom->loadHTML($content);
$dom->preserveWhiteSpace = FALSE;

$a = $dom->getElementById('a'); // jen abych se nemusel prokopávat uměle vytvořenou strukturou HTML dokumentu
//$a = $dom->childNodes->item(1)->childNodes->item(0)->childNodes->item(0);

var_dump($a->childNodes->length); // vypíše 2 :(

var_dump($a->childNodes->item(0)); // \DOMElement li

var_dump($a->childNodes->item(1)); // \DOMText mezera
Alphard
Profil
Jako workaround by měl dobře fungovat preprocessing. Stačí odstranit bílé znaky mezi tagy ze zdrojového XML.
iiic
Profil
Alphard:
funguje, díky
doufal jsem, že třeba bude nějaký čistější způsob, ale co už, tohle pomohlo :)

pokud by taky někdo potřeboval, tak pozor z regulárního výrazu se jim vytratilo zpětné lomítko:
$XmlFileText = preg_replace("/>s+</", "><", $XmlFileText);
// změnit na
$XmlFileText = preg_replace("/>\s+</", "><", $XmlFileText);

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: