PHP - 使用 simplexml_load_string 解析 XML - 使用 CDATA 获取空值? [复制]

Posted

技术标签:

【中文标题】PHP - 使用 simplexml_load_string 解析 XML - 使用 CDATA 获取空值? [复制]【英文标题】:PHP - Parse XML with simplexml_load_string - Getting empty values with CDATA? [duplicate] 【发布时间】:2015-02-18 17:43:24 【问题描述】:

当解析 XML 数组时:

<?xml version="1.0" encoding="utf-8"?>
<Products>
  <Product>
    <Code>ABC-1001</Code>
    <Brand>ZCOM</Brand>
  </Product>
</Products>

我得到以下输出:

Array
(
  [0] => Array
  (
    [Code] => AP1024-DDRII640
    [Brand] => ZCOM
  )

但是当XML是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Products Code="ABC-1001">
  <Product>
    <Code><![CDATA[ABC-1001]]></Code>
    <Brand><![CDATA[ZCOM]]></Brand>
  </Product>
</Products>

返回:

array
  0 => 
    array (size=12)
      '@attributes' => 
        array (size=1)
          'Code' => string 'ABC-1001' (length=8)
      'Code' => 
        array (size=0)
          empty
      'Brand' => 
        array (size=0)
          empty

这是从 URL 解析 XML 的方式:

$updateUrl = file_get_contents('http://www.someplace/xmlfeed/xml.cfm?asd=12345&uhg=9999');
$updateXml=<<<XML
$updateUrl
XML;
$updateXmlObject=json_decode(json_encode((array) simplexml_load_string($updateXml)), 1);
$updatephpArray=$updateXmlObject['Product'];

还有:

var_dump($updatePHPArray);exit;

如上给出输出。

现在,为什么我在第二个实例中得到空值?如果不访问 XML 源,我该如何解决这个问题?

【问题讨论】:

获取一个字符串究竟有什么意义,使用heredoc将该字符串填充到另一个字符串中,然后将第二个字符串填充到xml中,强制它到一个数组中。 json_encoding,json_decoding?那只是完全的货物崇拜节目。 @MarcB 我是菜鸟...这是我能想到的最好的。对任何更好的解决方案持开放态度,嘿:) SimpleXML with cdata -> ***.com/questions/2970602/… 好吧,既然正在进行一些规范化,那就没关系了。但仅用于原始转换:$xml = simplexml_load_file('http:/...'); 可以。 通过使用json_decode(json_encode()) hack,您同时抛弃了SimpleXML 的所有功能,并为自己引入了一大堆不必要的问题。 simplexml_load_string/simplexml_load_file 的结果是一个拥有很多有用魔力的物体,不要一有机会就扔掉它。 【参考方案1】:

问题似乎是您对数组进行的转换可能会返回与 XML 对象的实际结构不同的结果。

类似以下代码的代码应该会为您提供一个包含正确信息的数组:

$array = array_map('strval', (array) $xml->Product);

注意将这些部分转换为从中获取数据的字符串(在通过strval() 完成的示例中)。相反,json_encode() 不适用于 SimpleXMLElement

【讨论】:

谢谢,阅读本文并在 @BrainFooLong 发表评论后,只需将 LIBXML_NOCDATA 作为第三个参数传递给 simplexml_load_string() 即可解决此问题。正如你所建议的那样,我在阅读 cmets 时在文档中看到了这一点:) @IndigoIdentity 我怎么强调 LIBXML_NOCDATA 不是必需的。只是不要使用像json_decode(json_encode($blah)) 这样的黑客,也不要相信var_dump。相反,请阅读the examples of how to use SimpleXML properly。

以上是关于PHP - 使用 simplexml_load_string 解析 XML - 使用 CDATA 获取空值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 zend 读取 php.ini 进行 PHP 扩展(不是 PHP 语言)

php PHP - 使用AJAX调用php类函数

如何使用包含的 php 文件中的 php 变量

mac使用php-version切换PHP版本

如何使用php将php代码写入文件

PHP php-log - 使用PHP处理日志文件