атрибуты в корне приводят к тому, что xml-файл не загружается при симплексном переполнении стека

Итак, это дополнительный вопрос к моему предыдущему вопросу, который был решен, вот ссылка на него:
использование данных из дочернего элемента для выбора данных в другом элементе с использованием simplexml в php

спасибо @RomanPerekhrest за решение этой проблемы.

У меня есть этот кусок кода PHP с использованием Simplexml, чтобы прочитать мой XML-файл

<?php$xml = simplexml_load_file('../uploads/reports/report.xml');

$hits = $xml->xpath("results/hits/@rule_id");
$ruleIds = array_map(function($v){    // getting search path for each needed rule
return "profile_info/rules/rule[@id='". (string)$v. "']";
}, $hits);

foreach ($xml->xpath(implode(" | ", $ruleIds)) as $rule) {
echo '<div id="name">'. $rule->display_name .'</div>'.
'<div id="comment">'. $rule->display_comment .'</div>';
}
?>

еще раз, спасибо @RomanPerekhrest за то, что придумали это.

Этот фрагмент кода прекрасно работает с моим упрощенным xml-файлом, который я создал, чтобы проиллюстрировать свои проблемы в моих предыдущих вопросах, но когда я его применяю, он, похоже, не отображается.

Я нашел причину, по которой в моем корневом элементе есть некоторые атрибуты xmlns, из-за которых мой xml не загружается. Когда я вручную удаляю эти атрибуты, все работает как положено. (Я не буду перечислять весь XML-документ, так как он более 8500 строк)
Вот корневой элемент с атрибутами:

<report xsi:schemaLocation="http://www.callassoftware.com/namespace/pi4 pi4_results_schema.xsd" xmlns="http://www.callassoftware.com/namespace/pi4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

Мне нужен способ обойти в php. Поскольку эти xml-файлы генерируются другим программным обеспечением и отсутствие настроек в этом поколении, я не могу просто создать эти xml-файлы без этих атрибутов.

Спасибо

1

Решение

Ваш XML имеет пространство имен по умолчанию объявлен в корневом элементе, который потомки без префикса наследуют неявно :

xmlns="http://www.callassoftware.com/namespace/pi4"

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

//register prefix 'd' to reference default namespace URI
$xml->registerXPathNamespace('d', 'http://www.callassoftware.com/namespace/pi4');

//use the prefix to reference elements in the default namespace
$hits = $xml->xpath("d:results/d:hits/@rule_id");
$ruleIds = array_map(function($v){    // getting search path for each needed rule
return "d:profile_info/d:rules/d:rule[@id='". (string)$v. "']";
}, $hits);
3

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

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

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