通过循环的SimpleXMLElement访问属性(Looping through SimpleXM

2019-07-18 10:36发布

我试图用SimpleXML检索处理数据时遇到很大的困难。 我在这里读了许多线程这个问题上,他们看起来都像我在做什么,但我不工作。 下面是我得到了什么:

<ROOT>
    <ROWS COMP_ID="165462">
    <ROWS COMP_ID="165463">
</ROOT>

我的代码:

$xml = simplexml_load_file('10.xml');
foreach( $xml->ROWS as $comp_row ) {
    $id = $comp_row->COMP_ID;
}

当我通过这在我的调试步骤,我可以看到的$ id没有被设置为COMP_ID的字符串值,而是成为一个SimpleXMLElement本身含有的类名对象。 我试图解决这一属性,但没有工作,其中包括$ comp_row-的许多变化>属性() - > COMP_ID等。

我在想什么?

Answer 1:

SimpleXML的是阵列状物体。 骗片:

  • 前缀的子元素的数字索引或穿越
    • 不包括前缀的元素( 注意 ,我真的是前缀 ,不是空的命名空间SimpleXMLElement命名空间的处理是一个陌生的,可以说是打破。)
    • 第一个孩子: $sxe[0]
    • SimpleXMLElement具有匹配元素的子集: $sxe->ROWS$sxe->{'ROWS'}
    • 迭代孩子: foreach ($sxe as $e) $sxe->children()
    • 文本内容: (string) $sxeSimpleXMLElement总是返回另一个SimpleXMLElement ,所以如果你需要一个字符串显式转换呢
  • 前缀的子元素
    • $sxe->children('http://example.org')返回一个新SimpleXMLElement在匹配的命名空间元素, 命名空间中剥离 ,所以你可以用它在上一节等等。
  • 属性中的空命名空间为关键指标:
    • 具体属性:`$ SXE [ '属性名']
    • 所有的属性: $sxe->attributes()
    • $sxe->attributes()返回一个特殊SimpleXMLElement显示的属性元素属性,所以这两个了以下工作:
    • $sxe->attributes()->COMP_ID
    • $a = $sxe->attributes(); $a['COMP_ID'];
    • 属性的值:强制串(string) $sxe['attr-name']
  • 属性中的其他命名空间
    • 所有的属性: $sxe->attributes('http://example.org')
    • 具体属性: $sxe_attrs = $sxe->attributes('http://example.org'); $sxe_attrs['attr-name-without-prefix'] $sxe_attrs = $sxe->attributes('http://example.org'); $sxe_attrs['attr-name-without-prefix']

你想要的是:

$xml = '<ROOT><ROWS COMP_ID="165462"/><ROWS COMP_ID="165463"/></ROOT>';

$sxe = simplexml_load_string($xml);

foreach($sxe->ROWS as $row) {
    $id = (string) $row['COMP_ID'];
}


Answer 2:

你错过...

foreach( $xml->ROWS as $comp_row ) {
    foreach ($comp_row->attributes() as $attKey => $attValue) {
        // i.e., on first iteration: $attKey = 'COMP_ID', $attValue = '165462'
    }
}

PHP手册:的SimpleXMLElement ::属性



文章来源: Looping through SimpleXMLElement to access attributes