Как получить значение определенного дочернего XML с переполнением стека

Мне нужно получить значение настраиваемого поля «NewTitle» (ID 6), которое вложено в дочерний «custom_fields» следующего XML:

<issues total_count="63" offset="0" limit="100" type="array">
<issue>
<id>65</id>
<project id="7" name="ProjectName"/>
<tracker id="7" name="TrackerName"/>
<subject>MySubject</subject>
...
<custom_fields type="array">
<custom_field id="4" name="OrderType">
<value>Project</value>
</custom_field>
<custom_field id="26" name="ExtID">
<value>246558</value>
</custom_field>
<custom_field id="25" name="Area" multiple="true">
<value type="array">
<value>Process</value>
<value>System</value>
</value>
</custom_field>
<custom_field id="6" name="NewTitle">
<value>ABCDEF</value>
</custom_field>
...
<custom_field id="20" name="KST">
<value/>
</custom_field>
<custom_field id="11" name="LKF">
<value>3</value>
</custom_field>
<custom_field id="17" name="Link">
<value>XXX</value>
</custom_field>
</custom_fields>
<created_on>2015-12-14T08:00:03Z</created_on>
<updated_on>2016-01-28T09:07:20Z</updated_on>
<closed_on/>
</issue>
</issues>

Может кто-нибудь сказать мне, как это сделать с помощью PHP? Мне только удалось отобразить значения основных полей. Например предмет:

foreach ($xml->issue as $issue){
if((string) $issue->tracker['id'] == 7){
echo $issue->subject.'<br/>';
}
}

0

Решение

Используйте SimpleXML в сочетании с xpath:

$xml = simplexml_load_string($your_xml_here);
$fields = $xml->xpath("//custom_field[@name='NewTitle']");
foreach ($fields as $field) {
// do sth. useful here
}
3

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

Вы не очень конкретны о ключе (ах) для выбора <value> ты хочешь.

Я предполагаю на вашем примере, что вы хотите выбрать …

  • <value> родителя <custom_field>
  • имея атрибуты name = "NewTitle" а также id = "6"
  • имея <issue> предок с ребенком <tracker> с атрибутом id = "7"

xpath это хорошее решение, чтобы получить это значение напрямую без итерации. Это как SQL за XML,

  1. выберите право <issue>:

    /issues/issue[tracker/@id='7']
    

    Обратите внимание, как / отделяет родителя от ребенка, условия находятся в пределах []атрибуты имеют @,

  2. в рамках этого вопроса выберите <custom_field>с заданными атрибутами:

    (...)/custom_fields/custom_field[@name='NewTitle'][@id='6']
    
  3. тогда получите <value> дети (может быть больше, чем 1):

    (...)/value
    

Комбинированный:

$xml = simplexml_load_string($x);
$values = $xml->xpath("/issues/issue[tracker/@id='7']/custom_fields/custom_field[@name='NewTitle'][@id='6']/value");

$values массив, содержащий один <value> узлы или пустой массив:

foreach ($values as $val)
echo $val->asXML();

Выход:

<value>ABCDEF</value>

увидеть это в действии: https://eval.in/509835

0

У меня нет текстового редактора под рукой, и я не могу попробовать его сам, но это должно помочь, и вы поймете, как переходить через XML-вложения.

foreach ($xml->issue as $issue){
foreach ($issue['custom_field'] as $custField){
echo $custField['value'];
}
}
-1
По вопросам рекламы [email protected]