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

如何使用PHP获取特定XML子级的值,php,xml,api,simplexml,redmine,Php,Xml,Api,Simplexml,Redmine,我需要获取自定义_字段“NewTitle”(ID 6)的值,该字段嵌套在以下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"/> <

我需要获取自定义_字段“NewTitle”(ID 6)的值,该字段嵌套在以下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>

65
我的主体
...
项目
246558
过程
系统
ABCDEF
...
3.
XXX
2015-12-14T08:00:03Z
2016-01-28 09:07:20Z
有人能告诉我如何用PHP实现吗?我只显示了主字段的值。例如,主题:

foreach ($xml->issue as $issue){
        if((string) $issue->tracker['id'] == 7){
            echo $issue->subject.'<br/>';
        }
    }
foreach($xml->issue as$issue){
如果((字符串)$issue->tracker['id']==7){
echo$issue->subject.“
”; } }
将SimpleXML与xpath结合使用:

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

将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'];
    }
}

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

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

您对选择所需
的键不是很明确

通过您的示例,我假设您希望选择

  • 父级的
  • 具有属性
    name=“NewTitle”
    id=“6”
  • 有一个
    祖先和一个属性为
    id=“7”
xpath
是一个很好的解决方案,无需迭代即可直接获得该值。它类似于
XML
SQL
  • 选择右侧的

    /issues/issue[tracker/@id='7']
    
    注意
    /
    是如何将父项与子项分开的,条件在
    []
    中,属性具有
    @

  • 在该问题中,选择具有给定属性的

    (...)/custom_fields/custom_field[@name='NewTitle'][@id='6']
    
  • 然后获取
    子项(可以多于1个):

  • 合并:

    $xml = simplexml_load_string($x);
    $values = $xml->xpath("/issues/issue[tracker/@id='7']/custom_fields/custom_field[@name='NewTitle'][@id='6']/value");
    
    $values
    是包含单个
    节点的数组或空数组:

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

    <value>ABCDEF</value>
    
    ABCDEF
    

    请在操作中查看:

    您对选择所需的
    的键不是很明确

    通过您的示例,我假设您希望选择

    • 父级的
    • 具有属性
      name=“NewTitle”
      id=“6”
    • 有一个
      祖先和一个属性为
      id=“7”
    xpath
    是一个很好的解决方案,无需迭代即可直接获得该值。它类似于
    XML
    SQL
  • 选择右侧的

    /issues/issue[tracker/@id='7']
    
    注意
    /
    是如何将父项与子项分开的,条件在
    []
    中,属性具有
    @

  • 在该问题中,选择具有给定属性的

    (...)/custom_fields/custom_field[@name='NewTitle'][@id='6']
    
  • 然后获取
    子项(可以多于1个):

  • 合并:

    $xml = simplexml_load_string($x);
    $values = $xml->xpath("/issues/issue[tracker/@id='7']/custom_fields/custom_field[@name='NewTitle'][@id='6']/value");
    
    $values
    是包含单个
    节点的数组或空数组:

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

    <value>ABCDEF</value>
    
    ABCDEF
    
    查看它的实际操作:

    user simplexml_load_string($XMLData)…然后您可以在任何级别上迭代xml标记user simplexml_load_string($XMLData)…然后您可以在任何级别上迭代xml标记