Autor | Zpráva | ||
---|---|---|---|
iiic Profil |
#1 · Zasláno: 4. 1. 2017, 10:38:25
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 |
#2 · Zasláno: 4. 1. 2017, 11:49:22
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 |
#3 · Zasláno: 4. 1. 2017, 14:47:26
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 |
#4 · Zasláno: 5. 1. 2017, 00:50:31
Jako workaround by měl dobře fungovat preprocessing. Stačí odstranit bílé znaky mezi tagy ze zdrojového XML.
|
||
iiic Profil |
#5 · Zasláno: 5. 1. 2017, 11:03:30
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); |
||
Časová prodleva: 6 let
|
0