【问题标题】:PHP - Parse XML with simplexml_load_string - Getting empty values with CDATA? [duplicate]PHP - 使用 simplexml_load_string 解析 XML - 使用 CDATA 获取空值? [复制]
【发布时间】: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 -> stackoverflow.com/questions/2970602/…
  • 好吧,既然正在进行一些规范化,那就没关系了。但仅用于原始转换:$xml = simplexml_load_file('http:/...'); 可以。
  • 通过使用json_decode(json_encode()) hack,您同时抛弃了SimpleXML 的所有功能,并为自己引入了一大堆不必要的问题。 simplexml_load_string/simplexml_load_file 的结果是一个拥有很多有用魔力的物体,不要一有机会就扔掉它。

标签: php simplexml cdata


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2013-03-06
相关资源
最近更新 更多