3

我正在尝试使用 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 的字符串值,而是变成了一个包含 CLASSNAME 对象的 SimpleXMLElement 本身。我已经尝试了许多解决此属性的变体,但都没有奏效,包括 $comp_row->attributes()->COMP_ID 等。

我错过了什么?

4

2 回答 2

6

SimpleXML 是一个类似数组的对象。备忘单:

  • 无前缀子元素作为数字索引或可遍历
    • 不包括带前缀的元素(注意,我的真正意思是带前缀的,而不是空命名空间!命名空间SimpleXMLElement的处理很奇怪,而且可以说是被破坏了。)
    • 第一个孩子:$sxe[0]
    • SimpleXMLElement具有匹配元素子集的新元素: $sxe->ROWS$sxe->{'ROWS'}
    • 迭代孩子:foreach ($sxe as $e)$sxe->children()
    • 文字内容:(string) $sxe. SimpleXMLElement总是返回另一个SimpleXMLElement,所以如果你需要一个字符串显式地转换它
  • 前缀子元素
    • $sxe->children('http://example.org')返回一个新SimpleXMLElement的,其中包含匹配命名空间中的元素,命名空间被剥离,因此您可以像上一节一样使用它。
  • 空命名空间中的属性作为键索引:
    • 具体属性:`$sxe['attribute-name']
    • 所有属性:$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']

你想要的是:

$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'];
}
于 2013-01-20T04:04:32.703 回答
3

你不见了...

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::attributes

于 2013-01-20T01:49:20.873 回答