如何使用 PHP 获取特定 XML 子项的值

How to get value of specific XML child with PHP

我需要获取 custom_field "NewTitle" (ID 6) 的值,它嵌套在以下 XML 的子 "custom_fields" 中:

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

结合使用 SimpleXML 和 xpath:

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

我手头没有文本编辑器,我也无法自己尝试,但这应该可以解决问题,并让您了解如何遍历 xml 嵌套。

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

您对 select 和 <value> 所需的密钥不是很具体。

根据你的例子,我假设你想要 select...

  • 一个parent<custom_field><value>
  • 具有属性 name = "NewTitle"id = "6"
  • 有一个 <issue> 的祖先,其 child <tracker> 的属性为 id = "7"

xpath 是一个很好的解决方案,无需迭代即可直接获得该值。就像 SQL 对应 XML.

  1. select右边<issue>:

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

    注意 / 如何将 parent 与 child 分开,条件在 [] 内,属性有 @.

  2. 在该期中,select <custom_field>具有给定属性:

    (...)/custom_fields/custom_field[@name='NewTitle'][@id='6']
    
  3. 然后得到<value>children(可以不止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