【问题标题】:foreach shows attributes of first xml node onlyforeach 仅显示第一个 xml 节点的属性
【发布时间】:2014-07-31 21:29:26
【问题描述】:

我正在尝试显示每个 global_ivr_variable 的属性:

$xml = '
  <response method="switchvox.ivr.globalVariables.getList">
      <result>
           <global_ivr_variables>
               <global_ivr_variable id="1" name="cid_name" value="Smith" />
               <global_ivr_variable id="2" name="Q_ID_Global" value="COS" />
           </global_ivr_variables>
      </result>
  </response>
';

$sxml = simplexml_load_string($xml);

foreach($sxml->result->global_ivr_variables->global_ivr_variable->attributes() as $a => $b)
{
echo $a .'=' . $b . "<br>";
}

我得到的只是第一个节点的属性:

id="1"
name="cid_name"
value="Smith"

我还尝试了以下方法,但根本没有给我任何价值......

    foreach($sxml->result->global_ivr_variables as $xvar)
    {
     $a = $xvar->global_ivr_variable->id;
     $b = $xvar->global_ivr_variable->name;
     $c = $xvar->global_ivr_variable->value;
     echo 'a='.$a.', b='.$b.', c='.$c.'<br>';
    }

a=, b=, c=

感谢所有挺身而出帮助有需要的人!

【问题讨论】:

  • -&gt;id 等是属性,而不是节点。 $xvar-&gt;global_ivr_variables['id'] 或 simple_xml 中的任何内容都应该是您所需要的。

标签: php xml simplexml


【解决方案1】:

您几乎拥有它,但您需要遍历每个 &lt;global_ivr_variable&gt; 元素,然后提取属性:

foreach($sxml->result->global_ivr_variables->global_ivr_variable as $variable)
{
    foreach($variable->attributes() as $a => $b)
    {
        echo $a .'=' . $b . "<br>";
    }
}

【讨论】:

  • 如何解释为什么您的答案有效而 OP 无效?
  • @scrowler:没时间。随意投反对票/提供您自己的答案。
  • 我在几次尝试 foreach/foreach 时都接近了这一点,但从未得分。这真的澄清了我是如何轰炸那个的。上帝的速度!
【解决方案2】:

如果您使用 PHP 变量,这些问题通常很容易消失,因为您的代码更具可读性。

此外,您还可以通过数组表示法访问 SimpleXML 中的属性:

$variables = $sxml->result->global_ivr_variables->global_ivr_variable;

foreach ($variables as $variable)
{
    printf("%s = %s\n", $variable['name'], $variable['value']);
}

这给出了以下输出:

cid_name = Smith
Q_ID_Global = COS

正如您预先知道要查找的属性一样,使用这些名称可以使您的代码更加清晰和稳定。

但是,如果您只查找 global_ivr_variable 元素的 所有 属性,那么使用 XPath 对它们进行迭代会更容易:

$allAttributes = $sxml->xpath('//global_ivr_variable/@*');

foreach ($allAttributes as $attribute) {
    printf("%s = %s\n", $attribute->getName(), $attribute);
}

然后给出以下输出:

id = 1
name = cid_name
value = Smith
id = 2
name = Q_ID_Global
value = COS

这是完整的代码示例:

$xml = <<<XML
<response method="switchvox.ivr.globalVariables.getList">
    <result>
        <global_ivr_variables>
           <global_ivr_variable id="1" name="cid_name" value="Smith" />
           <global_ivr_variable id="2" name="Q_ID_Global" value="COS" />
        </global_ivr_variables>
    </result>
</response>
XML;

$sxml = simplexml_load_string($xml);

$variables = $sxml->result->global_ivr_variables->global_ivr_variable;

foreach ($variables as $variable)
{
    printf("%s = %s\n", $variable['name'], $variable['value']);
}

echo "----\n";

$allAttributes = $sxml->xpath('//global_ivr_variable/@*');

foreach ($allAttributes as $attribute) {
    printf("%s = %s\n", $attribute->getName(), $attribute);
}

【讨论】:

  • 这将检查如何获取我的数据的非常完整的解释。这也让我更详细地了解 xpath,因为这在另一种情况下会很有用。上帝的速度!
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 2014-06-27
  • 2013-05-16
  • 2013-01-13
  • 1970-01-01
相关资源
最近更新 更多