我正在尝试读取以下格式的数据:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<![CDATA[sample content]]><br />
<![CDATA[more content]]><br />
<![CDATA[content]]><br /></body>
数据来自一个远程xml文件,所以我无法更改它
$file = file_get_contents($r[0]->overview);
$xml = new SimpleXMLElement($file);
echo '<pre>';
print_r($xml);
echo '</pre>';
该输出:
SimpleXMLElement Object
(
[br] => Array
(
[0] => SimpleXMLElement Object
(
)
[1] => SimpleXMLElement Object
(
)
[2] => SimpleXMLElement Object
(
)
)
)
我不确定如何阅读内容,通常我可以看到一个数组或对象,我可以循环通过。
如有任何建议,我们将不胜感激。
问题只是SimpleXML的魔力。CDATA节是一种特殊类型的文本节点,它们允许在没有编码(<,>,",')的情况下用XML编写特殊字符。这有两个原因:脚本元素的向后兼容性和更好的可读性。
它们仍然是节点,可以这样读取:
<?php
$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<body>
<![CDATA[sample content]]><br />
<![CDATA[more content]]><br />
<![CDATA[content]]><br /></body>
XML;
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
// iterate all text child nodes that are not just whitespaces
foreach($xpath->evaluate('/body/text()[normalize-space(.) != ""]') as $node) {
var_dump($xpath->evaluate('string(.)', $node));
}
输出:https://eval.in/140237
string(14) "sample content"
string(12) "more content"
string(7) "content"
<![CDATA[sample content]]>
应该被封装在开始和结束标记中,只有这样才能检索数据。此外,要读取CDATA
内容,您应该使用LIBXML_NOCDATA
参数。
由于那些CDATA
没有任何适当的封装,您得到的是空数组。
固定代码
<?php
$content = '<?xml version="1.0" encoding="UTF-8"?>
<body>
<![CDATA[sample content]]><br />
<![CDATA[more content]]><br />
<![CDATA[content]]><br /></body>';
$content = str_replace(array('<br />','<!',']>'),array('','<br><!',']></br>'),$content);
$xml = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
print_r($xml);
OUTPUT:
SimpleXMLElement Object
(
[br] => Array
(
[0] => sample content
[1] => more content
[2] => content
)
)