xml — использование данных из дочернего элемента для выбора данных в другом элементе с использованием simplexml в переполнении стека

Итак, я использую simplexml в php для отображения элементов из XML-файла на веб-странице. Это работает нормально при выборе целого списка дочерних элементов в одном определенном элементе.
Однако дело в том, что мне нужно выбрать несколько правил в одном элементе и отобразить данные, прикрепленные к этим определенным правилам, найденным в другом элементе.

Чтобы уточнить, это упрощенная версия моего файла XML (он содержит все, что мне нужно):

<report>
<profile_info>
<rules>

<rule id="RUL1">
<display_name>
XMP does not have CreateDate entry in the XMP Basic Schema
</display_name>
<display_comment>
This entry of the predefined XMP Basic Schema defines the date and time when the document has been created. It is required by some PDF-based ISO standards.
</display_comment>
</rule>

<rule id="RUL133">
<display_name>
XMP does not have a VersionID entry in the XMP Media Management Schema
</display_name>
<display_comment>
The VersionID in the XMP Media Management Schema (xmpMM) is the version identifier for respective resource. This entry is required by some PDF-based ISO standards for file identification.
</display_comment>
</rule>

<rule id="RUL169">
<display_name>
Page does not have TrimBox or ArtBox
</display_name>
<display_comment>
Either ArtBox or TrimBox should be defined for pages in a PDF file that are used in prepress. PDF/X ISO standards require the presence of one of these boxes.
</display_comment>
</rule>

</rules>
</profile_info><results>
<hits rule_id="RUL169" severity="Error">
</hits>
<hits rule_id="RUL133" severity="Error">
</hits>
</results>
</report>

Пока что я могу отобразить весь список правил с их display_name и display_comment, используя simplexml внутри php.

Это не то, что я хочу, однако. Я хочу иметь возможность показывать только дочерние элементы правил, которые фактически дали ошибку, как показано в корневом элементе «результаты».

Подводя итог моей проблеме: возьмите идентификаторы правил, которые дали ошибку в <results> и использовать их для отображения display_name и display_comment, показанного в <rules>другой корневой элемент.

Этот php-код, который я имею, пока перечисляет полный список правил, которые работают, если это поможет. (это работает, но это не то, что я хочу, кстати)

<?php

if(file_exists('../uploads/reports/report.xml')){
$xml = simplexml_load_file('../uploads/reports/report.xml');
}
else{
exit('Could not load the file ...');
}

foreach ($xml->profile_info as $profile_info){
foreach ($profile_info->rules as $rules){
foreach ($rules->rule as $rule){

echo '<div id="name">'.$rule->display_name.'</div>'.'<div id="comment">'.$rule
->display_comment.'</div>';
?>

Заранее спасибо!

-1

Решение

Решение с использованием SimpleXMLElement::xpath а также array_map функции:

$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>';
}

Вывод «view-source»:

        <div id="name">
XMP does not have a VersionID entry in the XMP Media Management Schema
</div><div id="comment">
The VersionID in the XMP Media Management Schema (xmpMM) is the version identifier for respective resource. This entry is required by some PDF-based ISO standards for file identification.
</div><div id="name">
Page does not have TrimBox or ArtBox
</div><div id="comment">
Either ArtBox or TrimBox should be defined for pages in a PDF file that are used in prepress. PDF/X ISO standards require the presence of one of these boxes.
</div>
1

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

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

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