【问题标题】:how get indexed value from PHP object output of simplexml_load_file如何从 simplexml_load_file 的 PHP 对象输出中获取索引值
【发布时间】:2019-10-04 22:50:58
【问题描述】:

从下面的输出 1 我们可以看到 PHP simplexml_load_file 将相同的 index 标签转换为索引数组 [0,1,2,3,4]

我想知道如何从simplexml_load_file 的输出中获取索引?我厌倦了使用示例“php2”来做到这一点,而我得到了“output2”作为回报。是否有可能或如何获得“所需输出2”上显示的输出?提前谢谢你

test.xml:

<?xml version="1.0" encoding="utf-8"?>
<Report>
    <index><value>h</value></index>
    <index><value>e</value></index>
    <index><value>l</value></index>
    <index><value>l</value></index>
    <index><value>o</value></index>
</Report>

php1:

<?php
    $oFile = simplexml_load_file("test.xml") or die("error: Cannot create object");
    var_dump($oFile);
?>

输出1:

object(SimpleXMLElement)#1 (1) 
{ 
    ["index"]=> array(5) 
    { 
        [0]=> object(SimpleXMLElement)#2 (1) { ["value"]=> string(1) "h" } 
        [1]=> object(SimpleXMLElement)#3 (1) { ["value"]=> string(1) "e" } 
        [2]=> object(SimpleXMLElement)#4 (1) { ["value"]=> string(1) "l" } 
        [3]=> object(SimpleXMLElement)#5 (1) { ["value"]=> string(1) "l" } 
        [4]=> object(SimpleXMLElement)#6 (1) { ["value"]=> string(1) "o" } 
    } 
}

php2:

<?php
    $oFile = simplexml_load_file("test.xml") or die("error: Cannot create object");
    foreach ($oFile->index as $key=>$value) {
        echo $key.': '.$value->value.'<br>';
    }
?>

输出2:

index: h
index: e
index: l
index: l
index: o

期望的输出2:

0: h
1: e
2: l
3: l
4: o

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    你可以用一个计数器来获得钥匙......

    $key = 0;
    foreach ( $oFile->index as $index ) {
        echo ($key++)."=>".$index->value.PHP_EOL;
    }
    

    或者如果您要进一步处理数据,您可以将其添加到数组中...

    $data = [];
    foreach ( $oFile->index as $index ) {
        $data[] = (string)$index->value;
    }
    print_r($data);
    

    这给了...

    Array
    (
        [0] => h
        [1] => e
        [2] => l
        [3] => l
        [4] => o
    )
    

    【讨论】:

    • 或:$data = $oFile-&gt;xpath('*/value')
    【解决方案2】:

    简单的 XML 使用起来很痛苦:

    $oFile = simplexml_load_file("test.xml");
    
    foreach($oFile->xpath("index") as $key => $value) {
            echo "{$key}: {$value->value}<br>";
    }
    

    【讨论】:

    • 此解决方案有效!如果有人对此问题有更优雅或不同的解决方案,请发布。我会在几天内投票选出最佳答案。非常感谢!
    • 简单的 XML 使用起来很痛苦?!我可以从它所用的代码行数看出它真的很复杂:-/
    • @NigelRen 之所以如此痛苦,是因为您无权访问 PHP 对象。它看起来像一个 PHP SimpleXMLElement 对象,但实际上它是一个 libxml 资源,当您打印它时会自动转换为字符串。这就是为什么它打印起来好像它是一个数组,但它不是一个实际的数组。
    • 我意识到不用foreach直接访问'e':'$oFile->index[1]->value'
    • index[1] - 这几乎看起来好像您正在访问它,就好像它是一个数组。这是因为 SimpleXMLElement 允许以更直观的方式访问底层数据,而无需像答案中那样使用 XPath。
    【解决方案3】:

    当您要求一种更优雅的方式并且您说您需要 xpath 时,这与接受的答案基本相同,但没有投诉并使用它来获得好处:

    foreach ($oFile->xpath('*/value') as $key => $value) {
        echo $key, ': ', $value, "\n";
    }
    

    如果您仍然使用 xpath,它确实已经将结果转换为 SimpleXMLElements 数组 - 索引为零。

    另外直接查询您感兴趣的节点带来的好处是通过回显(将其转换为字符串)将其文本内容实际转换为字符串:

    0: h
    1: e
    2: l
    3: l
    4: o
    

    希望这对到目前为止的答案有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多