如何使用 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
.
select右边<issue>
:
/issues/issue[tracker/@id='7']
注意 /
如何将 parent 与 child 分开,条件在 []
内,属性有 @
.
在该期中,select <custom_field>
具有给定属性:
(...)/custom_fields/custom_field[@name='NewTitle'][@id='6']
然后得到<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
我需要获取 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
.
select右边
<issue>
:/issues/issue[tracker/@id='7']
注意
/
如何将 parent 与 child 分开,条件在[]
内,属性有@
.在该期中,select
<custom_field>
具有给定属性:(...)/custom_fields/custom_field[@name='NewTitle'][@id='6']
然后得到
<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