Necesito obtener el valor de custom_field "NewTitle" (ID 6) que está anidado dentro del niño "custom_fields" del siguiente 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>

¿Alguien puede decirme cómo hacer eso con PHP? Solo logré mostrar valores de los campos principales. Por ejemplo el tema:

foreach ($xml->issue as $issue){
        if((string) $issue->tracker['id'] == 7){
            echo $issue->subject.'<br/>';
        }
    }
0
Alex Miccoli 29 ene. 2016 a las 10:43

3 respuestas

La mejor respuesta

Utilice SimpleXML combinado con un xpath:

$xml = simplexml_load_string($your_xml_here);
$fields = $xml->xpath("//custom_field[@name='NewTitle']");
foreach ($fields as $field) {
    // do sth. useful here
}
3
Jan 29 ene. 2016 a las 07:53

No tengo un editor de texto disponible en un cajero automático ni puedo probarlo yo mismo, pero esto debería funcionar y darte una idea de cómo iterar a través de anidamientos xml.

foreach ($xml->issue as $issue){
    foreach ($issue['custom_field'] as $custField){
        echo $custField['value'];
    }
}
-1
Martin 29 ene. 2016 a las 07:56

No es muy específico sobre las claves para seleccionar la <value> que desea.

Supongo por su ejemplo que desea seleccionar ...

  • La <value> de una madre <custom_field> El <value> de un padre <custom_field>
  • tener los atributos name = "NewTitle" y id = "6"
  • tener un antepasado <issue> con un hijo <tracker> con un atributo id = "7"

xpath es una buena solución para llegar a ese valor directamente sin iteración. Es como SQL para XML.

  1. seleccione el <issue> correcto:

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

    Observe cómo / separa al padre del hijo, las condiciones están dentro de [], los atributos tienen @.

  2. dentro de ese número, seleccione un <custom_field> con los atributos dados:

    (...)/custom_fields/custom_field[@name='NewTitle'][@id='6']
    
  3. luego obtenga los hijos <value> (puede ser más de 1):

    (...)/value
    

Conjunta:

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

$values es una matriz que contiene nodos <value> únicos o una matriz vacía:

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

Salida:

<value>ABCDEF</value>

Véalo en acción: https://eval.in/509835

0
michi 29 ene. 2016 a las 15:58