使用PHP从HTML CDATA中的xml文件中读取数据

时间:2014-04-22 11:31:33

标签: php xml

我正在尝试以这种格式读取数据:

<?xml version="1.0" encoding="UTF-8"?>
<body>
<![CDATA[sample content]]><br />
<![CDATA[more content]]><br />
<![CDATA[content]]><br /></body>

数据来自远程xml文件,所以我无法改变它。我试图用PHP使用

读取这个
$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
            (
            )

    )

)

我不确定如何阅读内容,通常我可以看到我可以循环的数组或对象。

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

<![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
        )

)

答案 1 :(得分:0)

问题只是SimpleXMLs的魔力。 CDATA部分是一种特殊的文本节点,它们允许在没有编码的情况下用XML编写特殊字符(&lt;,&gt;,&#34;,&#39;)。这有两个原因:脚本元素的向后兼容性和更好的人类可读性。

它们仍然是节点,可以这样读取:

<?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"