<?php
/ Bez tohoto volání při načítání HTML5 vyskakují podobné chyby:
// Warning: DOMDocument::loadHTML(): Tag header invalid in Entity
libxml_use_internal_errors(true);
$data = file_get_contents("test.html");
$dom = new DOMDocument();
$dom->loadHtml(mb_convert_encoding($data, 'HTML-ENTITIES', 'UTF-8'));
$finder = new DomXPath($dom);
// Elementy
$nodesByElement = $finder->query("//a"); # CSS: a
$nodesByElement = $finder->query("//a/span"); # CSS: a > span
$nodesByElement = $finder->query("//a//span"); # CSS: a span
// ID a atributy
$nodeById = $finder->query("//*[@id='testId']"); # CSS: #testId
$nodeById = $finder->query("//div[@id='testId']"); # CSS: div#testId
$nodeByAttr = $finder->query("//*[@data-city]"); # CSS: [data-city]
// Třídy - těch může být více v jednom atributu, trochu se to komplikuje
// CSS: .inactive
$classToFind = "inactive";
$byClass = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' ".$classToFind." ')]");
// XPath se v těchto případech nechová úplně stejně jako CSS
$byIndex = $finder->query("//div/a[2]"); # CSS: div > a:nth-child(2)
$lastNode = $finder->query("//div/a[last()]");# CSS: div > a:last-child
// Vyhledávání pouze v dříve vyhledaném elementu
$finder->query("//a", $nodeById);
// Rodič, potomci, předchozí sourozenec, následující sourozenec
// POZOR: Počítá i TextNode
$parentNode = $nodeById->item(0)->parentNode;
$previousSibling = $nodeById->item(0)->previousSibling;
$nextSibling = $nodeById->item(0)->nextSibling;
$children = $nodeById->item(0)->childNodes;
// Získání kusu HTML nalezeného selektorem
$htmlPart = $dom->saveHtml($nodeById->item(0));
//Získání hodnotu atributu
$linkNode->item(0)->getAttribute("href");
// Změnu atributu
$linkNode->item(0)->setAttribute("href", "/");
// Smazání tagu img, který je přímým potomkem
$toRemove = $finder->query("img", $nodeList->item(2));
$removedItem = $nodeList->item(2)->removeChild($toRemove->item(0));
//Vložení nového (nyní odstraněného) elementu
$nodeList->item(0)->appendChild($removedItem);