Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从HTML CDATA中的xml文件读取数据_Php_Xml - Fatal编程技术网

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

使用PHP从HTML CDATA中的xml文件读取数据,php,xml,Php,Xml,我正在尝试读取以下格式的数据: <?xml version="1.0" encoding="UTF-8"?> <body> <![CDATA[sample content]]><br /> <![CDATA[more content]]><br /> <![CDATA[content]]><br /></body> 我不确定如何读取内容,通常我可以看到一个数组或对象,我可以循环通过 任何

我正在尝试读取以下格式的数据:

<?xml version="1.0" encoding="UTF-8"?>
<body>
<![CDATA[sample content]]><br />
<![CDATA[more content]]><br />
<![CDATA[content]]><br /></body>
我不确定如何读取内容,通常我可以看到一个数组或对象,我可以循环通过

任何建议都将不胜感激。

应该将
封装在一个开始和结束标签中,只有这样才能检索数据。另外,要读取
CDATA
内容,您应该使用
LIBXML\u NOCDATA
参数

由于那些
CDATA
没有任何适当的封装,因此您得到的是空数组

固定代码。。
问题只是简单的魔法。CDATA节是一种特殊的文本节点,它们允许在不使用编码(,“,”)的情况下用XML编写特殊字符。这有两个原因:脚本元素的向后兼容性和更好的人类可读性

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

string(14) "sample content"
string(12) "more content"
string(7) "content"

有什么解决办法吗?因为我无法更改远程xml文件,只能读取它们。
SimpleXMLElement Object
(
[br] => Array
    (
        [0] => SimpleXMLElement Object
            (
            )

        [1] => SimpleXMLElement Object
            (
            )

        [2] => SimpleXMLElement Object
            (
            )

    )

)
<?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);
SimpleXMLElement Object
(
    [br] => Array
        (
            [0] => sample content
            [1] => more content
            [2] => content
        )

)
<?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));
}
string(14) "sample content"
string(12) "more content"
string(7) "content"