如何用PHP获取特定XML子元素的值

时间:2016-01-29 07:43:43

标签: php xml api simplexml redmine

我需要获得custom_field" 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/>';
        }
    }

3 个答案:

答案 0 :(得分:3)

将SimpleXML与xpath结合使用:

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

答案 1 :(得分:0)

您对选择所需<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
    
  4. 组合:

    $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

答案 2 :(得分:-1)

我手头上没有短信,也不能自己尝试,但这应该可以解决问题,让你知道如何通过xml嵌套进行迭代。

foreach ($xml->issue as $issue){
    foreach ($issue['custom_field'] as $custField){
        echo $custField['value'];
    }
}