【问题标题】:PHP: How to get an associative array from this XML?PHP:如何从此 XML 中获取关联数组?
【发布时间】:2012-10-19 09:16:39
【问题描述】:

到目前为止,这是我的代码......不用说,它不起作用:(

$feed = <<< THEXML

<programs>
<program>
<date>2009-04-16</date>
<start_time>17:00</start_time>
<leadtext>hello hello!
</leadtext>
<name>Program 1</name>
<b-line>Comedy</b-line>
<synopsis>Funny stuff
</synopsis>
<url>http://www.domain.tld/program_name</url>
</program>
<programs>
THEXML;


$xml  = (array) simplexml_load_string($feed);

print_r($xml);exit;

感谢任何帮助,已经在 php.net 网站上呆了几个小时,感觉脑残了。

请注意,在上面的示例 xml 中只有一个

 <program>...</program>

标签,但实际上我需要使用其中的一个或多个。 例如

 <programs>
 <program>...</program>
 <program>...</program>
 <program>...</program>
 </programs>

我想如果我可以让一个工作,然后我可以循环它,但我只是想我会在这里解释我要做什么。

提前致谢!

【问题讨论】:

  • print_r($xml); 的输出是什么?是什么让您无法循环播放?
  • 您发布的 XML 也不是有效的 XML。
  • 在到达 print_r 语句之前出现错误。不幸的是,这就是我必须使用的 XML……我可以在开头或结尾添加一些东西……但中间的其余部分必须保持不变。
  • 好的,警告.. 不是错误,底部的输出是:Array ( [0] => ) 将在一秒钟内发布警告
  • 警告:simplexml_load_string() [function.simplexml-load-string]:实体:第 17 行:解析器错误:过早标记程序中的数据结束第 17 行 C:\wamp\www\MTG\test_array2.php 第 26 行 ****** 警告:simplexml_load_string() [ function.simplexml-load-string]: <程序>在 C:\wamp\www\MTG\test_array2.php 第 2 行

标签: php xml arrays


【解决方案1】:

假设提供程序为您提供了有效的 XML,那么您只需遍历程序并使用您需要的任何信息,如下所示:

<?php
foreach ( $xml as $node ) {
    echo $node->synopsis;
    //or whatever property you want to access on the SimpleXMLElement Object
}

由于您没有正确的 XML(作为未封闭的 &lt;programs&gt; 标记,那么您可能需要修改脚本以更正该错误,如下所示:

$feed = preg_replace('/<programs>$/', '</programs>', trim($feed));

【讨论】:

  • XML 将与我发布的格式完全相同,我可以在开头或结尾添加一些内容,但不能触摸进来的 xml。
  • 那么它不是有效的 XML,所以使用 XML 解析器是不可行的,特别是如果你不能纠正被抛出的错误。
  • 好吧,首先按照@StRuPs 的建议来纠正 XML,可能会执行以下操作:$xml = preg_replace('/&lt;programs&gt;$/, '&lt;/programs&gt;', trim($xml));,然后通过 simple_xml_load_string(); 提供结果;
  • 是的,这给了我一些输出......谢谢!我想我可以使用我现在得到的输出:)
【解决方案2】:

你缺少结束标签。

$feed = <<< THEXML

<programs>
<program>
<date>2009-04-16</date>
<start_time>17:00</start_time>
<leadtext>hello hello!
</leadtext>
<name>Program 1</name>
<b-line>Comedy</b-line>
<synopsis>Funny stuff
</synopsis>
<url>http://www.domain.tld/program_name</url>
</program>
</programs> // <========= here
THEXML;

【讨论】:

  • 我不擅长XML,我看到你指点了,但是它应该怎么看呢?它以程序开头,以 /programs 结尾...缺少什么?
  • 这就是给你上一个错误的原因。要将其转换为数组,您必须迭代地访问每个节点及其子节点。我会为你获取一些代码。 ;)
  • 我有点明白你的意思,我取出了“programS”标签并得到了一个数组......问题是我可能会得到 1 个“program”(没有 S)或许多“program” " 包含在 "programS" 标签中的标签 :( 好的,将等待您的回复。
  • 我尝试使用 DOMDocument 但它不起作用。有这个扩展 Tidy,但输出不正确。在这里获取:php.net/manual/en/book.tidy.php 并试试这个:// Config $config = array( 'indent' =&gt; true, 'input-xml' =&gt; true, 'output-xml' =&gt; true, 'wrap' =&gt; false ); // Tidy $tidy = new tidy(); $tidy-&gt;parseString($feed, $config, 'utf8'); $tidy-&gt;cleanRepair(); print_r($tidy);
  • 别担心,我想我可以使用 Rob 的解决方案,因为我得到了一些输出并且没有错误。支持你,再次感谢。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2013-02-17
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多