【问题标题】:display data from XML using php simplexml使用 php simplexml 显示来自 XML 的数据
【发布时间】:2011-04-29 15:06:02
【问题描述】:

我有一段XML如下

<records count="2">
  <record>
    <firstname>firstname</firstname>
    <middlename>middlename</middlename>
    <lastname>lastname</lastname>
    <namesuffix/>
    <address>
      <street-number>demo</street-number>
      <street-pre-direction/>
      <street-name>demo</street-name>
      <street-post-direction/>
      <street-suffix>demo</street-suffix>
      <city>demo</city>
      <state>NY</state>
      <zip>demo</zip>
      <zip4>demo</zip4>
      <county>demo</county>
    </address>
    <phonenumberdetails>
      <phonenumber>demo</phonenumber>
      <listed>demo</listed>
      <firstname>demo</firstname>
    </phonenumberdetails>
    <dob day="" month="" year=""/>
    <age/>
    <date-first month="10" year="1999"/>
    <date-last month="04" year="2011"/>
  </record>
  <record>
    <firstname>firstname</firstname>
    <middlename>middlename</middlename>
    <lastname>lastname</lastname>
    <namesuffix/>
    <address>
      <street-number>demo</street-number>
      <street-pre-direction/>
      <street-name>demo</street-name>
      <street-post-direction/>
      <street-suffix>demo</street-suffix>
      <city>demo</city>
      <state>NY</state>
      <zip>demo</zip>
      <zip4>demo</zip4>
      <county>demo</county>
    </address>
    <phonenumberdetails>
      <phonenumber>demo</phonenumber>
      <listed>demo</listed>
      <firstname>demo</firstname>
    </phonenumberdetails>
    <dob day="" month="" year=""/>
    <age/>
    <date-first month="10" year="1999"/>
    <date-last month="04" year="2011"/>
  </record>
</records>

现在,我已经能够使用 SimpleXML 获取 PHP 中的所有数据,除了 date-first 和 date-last 元素。我一直在使用下面列出的代码

$dateFirst           = 'date-first';
$dateLast            = 'date-last';
$streetNumber        = 'street-number';
$streetPreDirection  = 'street-pre-direction';
$streetName          = 'street-name';
$streetPostDirection = 'street-post-direction';
$streetSuffix        = 'street-suffix';
$unitDesignation     = 'unit-designation';
$unitNumber          = 'unit-number';

foreach ($reportDataXmlrecords->records->record as $currentRecord) {
    echo $currentRecord->$dateFirst['month'].'/'.$currentRecord->$dateFirst['year'];
    echo $currentRecord->$dateLast['month'].'/'.$currentRecord->$dateLast['year'];
    echo $currentRecord->address->$streetNumber;
    $currentRecord->address->$streetName; // ......and so on 
}

其中$reportDataXmlrecords是来自父节点的simpleXML对象的一部分

但是前两个回显没有打印任何内容,其他所有都正确打印,具体来说,我无法访问中的数据

<date-first month="10" year="1999"/>
<date-last month="04" year="2011"/>

如果我这样做也可以用于调试

print_r($currentRecord->$dateFirst);

打印出来

SimpleXMLElement Object ( 
    [@attributes] => Array ( [month] => 10 [year] => 1999 ) 
)

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 我猜这个问题需要一些格式方面的帮助。
  • 如果你 var_dump date-first 和 date-last 而不是 echo,你会得到什么?
  • @GordonM 如果我这样做var_dump($currentRecord-&gt;$dateFirst); 我会得到object(SimpleXMLElement)#32 (1) { ["@attributes"]=&gt; array(2) { ["month"]=&gt; string(2) "10" ["year"]=&gt; string(4) "1999" } }

标签: php xml simplexml


【解决方案1】:

你的问题是你什么时候做

$currentRecord->$dateFirst['month']

PHP 将首先评估 $dateFirst['month'] 作为一个整体,然后再尝试将其用作属性

$dateFirst = 'date-first';
var_dump( $dateFirst['month'] ); // gives "d"

因为strings can be accessed by offset with array notation,但非整数偏移量被转换为整数,并且因为将“月”转换为整数为0,所以您正在尝试执行$currentRecord-&gt;d:

$xml = <<< XML
<record>
    <date-first month="jan"/>
    <d>foo</d>
</record>
XML;

$record = simplexml_load_string($xml);
$var    = 'date-first';
echo $record->$var['month']; // foo

您可以使用大括号访问连字符的属性:

$record->{'date-first'}['month'] // jan

在旁注中,当您的问题中显示的 XML 确实是您使用 SimpleXml 加载的 XML 时,例如当&lt;records&gt;是根节点时,那么做

$reportDataXmlrecords->records->record

无法工作,因为$reportDataXmlrecords 已经是根节点,如果要遍历其中的记录元素,则必须省略-&gt;records。

【讨论】:

  • 对了,不是根节点,我会在问题中添加更正。感谢您的出色回答,太好了,我学到了新东西。仅提及$record-&gt;{'dateFirst'}['month'] // jan,我认为您的意思是$record-&gt;{'date-first'}['month'] // jan,第二个实例对我有用。可能是笔误
猜你喜欢
  • 2019-07-29
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多