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