<?php
// to retrieve selected html data, try these DomXPath examples:
$file = $DOCUMENT_ROOT. "test.html";
$doc = new DOMDocument();
$doc->loadHTMLFile($file);
$xpath = new DOMXpath($doc);
// example 1: for everything with an id
//$elements = $xpath->query("//*[@id]");
// example 2: for node data in a selected id
//$elements = $xpath->query("/html/body/div[@id='yourTagIdHere']");
// example 3: same as above with wildcard
$elements = $xpath->query("*/div[@id='yourTagIdHere']");
if (!is_null($elements)) {
foreach ($elements as $element) {
echo "<br/>[". $element->nodeName. "]";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "\n";
}
}
}
?>
PHP.mk документација
DOMXPath
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
class.domxpath.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + преведен приказ
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
class.domxpath.php
DOMXPath
Референца за `class.domxpath.php` со подобрена типографија и навигација.
Класата DOMXPath
класата mysqli_driver
Вовед
Овозможува користење на XPath 1.0 прашања на HTML или XML документи.
Синопсис на класата
Својства
- document
- Документот што е поврзан со овој објект.
- registerNodeNamespaces
-
Кога е поставено на
true, просторите на имиња во јазолот се регистрирани.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.4.0 | Веќе не е можно да се клонира DOMXPath објект. Правењето на тоа ќе резултира со фрлање исклучок. Пред PHP 8.4.0 ова резултираше со неупотреблив објект. |
| 8.0.0 | На registerNodeNamespaces својство е додадено. |
Содржина
- DOMXPath::__construct — Го дели овој јазол на два јазли на наведениот офсет
- DOMXPath::evaluate — Создава нов DOMXPath објект
- DOMXPath::query — Го проценува дадениот XPath израз и враќа типизиран резултат ако е можно
- DOMXPath::quote — Го проценува дадениот XPath израз
- DOMXPath::registerNamespace — Го цитира низата за употреба во XPath израз
- DOMXPath::registerPhpFunctionNS — Го регистрира просторот за имиња со DOMXPath објектот
- DOMXPath::registerPhpFunctions — Регистрира PHP функции како именски простор на XPath функција
Белешки од корисници 5 белешки
Марк Омохундро, ajamyajax dot com ¶
пред 17 години
TechNyquist ¶
пред 6 години
When working with XML (as a strict format) might be very important to give a namespace to XPath object in order to make it work properly.
I was experiencing "query" always returning empty node lists, it could not find anything. Only a broad "//*" was able to show off only the root element.
Then found out that registering the namespace reported in the "xmlns" attribute of the root element in the XPath object, and writing the namespace near the elements name, made it work properly.
So for an XML like this (from a sitemap):
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://example.com/index.php</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
</urlset>
I needed the following XPath configuration:
<?php
$doc = new DOMDocument;
$doc->load("sitemap.xml");
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('ns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
$nodes = $xpath->query('//ns:urlset/ns:url');
?>
Then again, that "xmlns" could be provided dynamically from the root element attribute of course.
peter на softcoded dot com ¶
пред 8 години
You may not always know at runtime whether your file has
a namespace or not. This can make it difficult to create
XPath queries. Use the seriously underdocumented
"namespaceURI" property of the documentElement of a
DOMDocument to determine if there is a namespace.
Use code such as the following:
$doc = new DOMDocument();
$doc->load($file);
$xpath = new DOMXPath($doc);
$ns = $doc->documentElement->namespaceURI;
if($ns) {
$xpath->registerNamespace("ns", $ns);
$nodes = $xpath->query("//ns:em[@class='glossterm']");
} else {
$nodes = $xpath->query("//em[@class='glossterm']");
}
//look at nodes here
peter на softcoded dot com ¶
пред 8 години
Using XPath expressions can save a lot of programming
and allow you to home in on only the nodes you want.
Suppose you want to delete all empty <p> tags.
If you create a query using the following XPath expression,
you can find <p> tags that do not have any text
(other than spaces), any attributes,
any children or comments:
$expression = "//p[not(@*)
and not(*)
and not(./comment())
and normalize-space(text())='']";
This expression will only find para tags that look like:
<p>[any number of spaces]</p>
<p></p>
Imagine the code you would have to add if you used
DOMDocument::getElementsByTagName("p") instead.
archimedix32783262 на mailinator dot com ¶
пред 11 години
Note that evaluate() will use the same encoding as the XML document.
So if you have a UTF-16 XML, you will have to query using UTF-16 strings.
You can use iconv() to convert from your code's encoding to the target encoding for better legibility.