Почему тест узла типа узла () XPath возвращает дубликаты при использовании с SimpleXMLElement?

Я использовал это изучить XML-документ для практики. И я не понимаю, функция node () в XPath. Например, если я напишу:

$catalog = new SimpleXMLElement("cd.xml",null,true);
$elms = $catalog->xpath("//CD[23]/node()");

print_r($elms);

Результат:

Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[id] => 24
[genre] => soul
)

[TITLE] => The dock of the bay
[ARTIST] => Otis Redding
[COUNTRY] => USA
[COMPANY] => Stax Records
[PRICE] => 7.90
[YEAR] => 1968
)

[1] => SimpleXMLElement Object
(
[0] => The dock of the bay
)

[2] => SimpleXMLElement Object
(
[@attributes] => Array
(
[id] => 24
[genre] => soul
)

[TITLE] => The dock of the bay
[ARTIST] => Otis Redding
[COUNTRY] => USA
[COMPANY] => Stax Records
[PRICE] => 7.90
[YEAR] => 1968
) ...

и так далее, повторяя элемент CD [23] после каждого дочернего элемента. Я пробовал много вариантов этого, и всегда получаю дубликаты в некотором роде. Я не понимаю, почему это?

Я попытался отредактировать документ XML, удалив новые строки и пробелы, чтобы между элементами не было текстовых узлов, и я получил результат без дубликатов. Это тот случай, когда метод xpath () представлял эти текстовые узлы?

0

Решение

Я думаю, что часть проблемы является результатом упрощения, которое включает SimpleXML, метод xpath возвращает массив SimpleXMLElementс и с вашим путем, используя node() выбрать любой вид дочернего узла CD[23] в чистом отображении XPath вы получите список или набор узлов, содержащий текстовые узлы и узлы элементов. Похоже, что разработчики этого API для PHP в случае выбранного текстового узла возвращают его родительский элемент, поэтому для любого дочернего текстового узла CD[23] выбрав, вы получите тот же родительский элемент, возвращенный в массиве. Вы можете пойти с CD[23]/* выбрать любые дочерние элементы.

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector