Возврат дочерних узлов с использованием запроса xpath

Я пытаюсь вернуть все «полевые» потомки узла «ядро» ниже:

<archive xmlns="http://rs.tdwg.org/dwc/text/" metadata="eml.xml">
<core encoding="utf-8" fieldsTerminatedBy="\t" linesTerminatedBy="\n" fieldsEnclosedBy="" ignoreHeaderLines="1" rowType="http://rs.tdwg.org/dwc/terms/Occurrence">
<files>
<location>occurrence.txt</location>
</files>
<id index="0" />
<field index="1" term="http://rs.tdwg.org/dwc/terms/class"/>
<field index="2" term="http://rs.tdwg.org/dwc/terms/maximumDepthInMeters"/>
<field index="3" term="http://purl.org/dc/terms/language"/>
<field index="4" term="http://rs.tdwg.org/dwc/terms/coordinatePrecision"/>
<field index="5" term="http://rs.tdwg.org/dwc/terms/decimalLatitude"/>
</core>
</archive

У меня есть следующий PHP:

$xml = new \DOMDocument();
$xml->preserveWhiteSpace = false;
$xml->load($input_xml);

$xpath = new \DOMXpath($xml);
$xpath->registerNamespace('ns', $xml->documentElement->namespaceURI);

Нечто подобное работает для извлечения определенного «поля» и получения его индекса:

$query = $xpath->query("//ns:field[contains(@term, 'http://rs.tdwg.org/dwc/terms/class')]")->item(0);
$url = $query->attributes->getNamedItem("index")->nodeValue;

Я пробовал подобные запросы, используя всевозможные примеры в сети. Никто из них не работал

$children = $xpath->query("//ns:core/field");
$children = $xpath->query("//core/field");
$children = $xpath->query("/core/field");
$children = $xpath->query("/core/*");
$children = $xpath->query("/archive/core/field");
$children = $xpath->query("//ns:core/ns:field");

В конечном итоге я пытаюсь вернуть все «полевые» узлы в «ядро», пройти через них и создать массив из их индекса и термина. Например:

$myArray = array(
"1" => "http://rs.tdwg.org/dwc/terms/class",
"2" => "http://rs.tdwg.org/dwc/terms/maximumDepthInMeters",
"3" => "http://purl.org/dc/terms/language",
);

Любая помощь будет оценена. Благодарю.

1

Решение

Это может быть пространство имен, которое сбило вас с толку; Вы также не запрашивали правильный атрибут (вы смотрели на index, но URL-адреса находятся в term). Попробуйте этот код:

foreach( $xpath->query('/ns:archive/ns:core/ns:field') as $field) {
if ( $field->attributes->getNamedItem("term")->nodeValue ) {
echo "URL: " . $field->attributes->getNamedItem("term")->nodeValue . "\n";
}
}
1

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

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

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