xml — PHP / xPath Query на ncx (epub) завершается неудачно

Я не могу получить результаты, используя xPath для таких файлов, как этот :

<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
<head>
<meta name="dtb:uid" content="RT8513Z9UM0NLKLF8QX9QDJ3E6ZFL2"/>
<meta name="dtb:depth" content="3"/>
</head>
<docTitle>
<text>Document Title</text>
</docTitle>
<navMap>
<navPoint id="navPoint-1" playOrder="1">
<navLabel>
<text>Section with no subsection</text>
</navLabel>
<content src="text/content001.xhtml"/>
</navPoint>
<navPoint id="navPoint-2" playOrder="2">
<navLabel>
<text>TOC entry name Section title
</text>
</navLabel>
<content src="text/content001.xhtml#heading_id_3"/>
<navPoint id="navPoint-3" playOrder="3">
<navLabel>
<text>Section entry name.</text>
</navLabel>
<content src="text/content002.xhtml"/>
</navPoint>
<navPoint id="navPoint-4" playOrder="4">
<navLabel>
<text>Introduction.</text>
</navLabel>
</navPoint>
</navPoint>
</navMap>
</ncx>

Выполняя следующий код:

$ncx = new DOMDocument();
$ncx->preserveWhiteSpace = false;
$ncx->load('/path/to/file');

$xpath = new DOMXPath( $ncx );

$query1 = 'namespace::*';
$result = $xpath->query( $query1 );
echo $result->length . PHP_EOL;

$query2 = '/ncx/navMap/navLabel/text[. = "Introduction."]';
$result = $xpath->query( $query2 );
echo $result->length . PHP_EOL;

$head = $ncx->getElementsbyTagName('head')->item(0);

$query3 = 'head/meta[@name="dtb:depth"]';
$result = $xpath->query( $query3, $head );
echo $result->length . PHP_EOL;

$query4 = 'meta[@name="dtb:depth"]';
$result = $xpath->query( $query4, $head );
echo $result->length . PHP_EOL;

только $query1 дает действительный результат.
Кто-нибудь может подсказать, где ошибка?

Спасибо

2

Решение

Основная проблема в том, что ваш XPath не учитывал пространство имен XML. Ваш XML имеет пространство имен по умолчанию, определенное здесь:

<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">

Итак ncx Элемент и его потомки без префикса находятся в этом пространстве имен по умолчанию. Чтобы запросить элемент в пространстве имен по умолчанию, вам необходимо сопоставить префикс с пространством имен и использовать этот префикс в вашем XPath, например:

//map prefix "d" to the default namespace uri
$xpath->registerNamespace("d", "http://www.daisy.org/z3986/2005/ncx/");
.....
$head = $ncx->getElementsbyTagName('head')->item(0);
.....
//use the registered prefix properly in the XPath
$query4 = 'd:meta[@name="dtb:depth"]';
$result = $xpath->query( $query4, $head );
echo $result->length . PHP_EOL;

eval.in demo

выход :

1

кроме проблемы пространства имен, как объяснено выше, вам необходимо перепроверить ваш XPath, т.е. $query2Убедитесь, что оно точно соответствует расположению целевых элементов в XML.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]