在同一节点下将子节点与cdata混合。有效吗?

时间:2009-11-17 10:40:23

标签: php xml simplexml cdata

我需要解析以下xml文档(来自外部Web服务):

...
<dati>
    <Riconoscimento>
        <IdentificativoPosizione>xxxx</IdentificativoPosizione>
        <OutputRestituiti>xxx</OutputRestituiti>
    </Riconoscimento>
    <![CDATA[text text text]]>
</dati>    
...

问题是,直到有节点“Riconoscimento”simplexml解析器无法读取cdata部分,如果我删除该子节点,一切正常工作。

所以主要的问题是:它是一个有效的xml文档,如果它是有效的是有一些方法来访问CDATA部分与PHP而无需手动删除额外的孩子?

提前致谢。

2 个答案:

答案 0 :(得分:1)

你可以这样:

$x = simplexml_load_string('<root><dati>
    <Riconoscimento>
        <IdentificativoPosizione>xxxx</IdentificativoPosizione>
        <OutputRestituiti>xxx</OutputRestituiti>
    </Riconoscimento>
    <![CDATA[text text text]]>
</dati></root>', 'SimpleXMLElement', LIBXML_NOCDATA);

var_dump((string)$x->dati);

请注意LIBXML_NOCDATA参数以将CDATA转换为文本节点。

答案 1 :(得分:1)

首先:这是一个有效的XML文档(参见here)。

  

定义: CDATA部分可能会发生   可能出现任何字符数据;   它们用于逃避文本块   包含哪些字符   否则被识别为标记。   CDATA部分以字符串“开头”   <![CDATA[“并以字符串结尾”   ]]>“:

在您的情况下,<data/> - 元素是混合内容元素。

$xmlString = <<<XML
<dati>
    <Riconoscimento>
        <IdentificativoPosizione>xxxx</IdentificativoPosizione>
        <OutputRestituiti>xxx</OutputRestituiti>
    </Riconoscimento>
    <![CDATA[text text text]]>
</dati>
XML;
$xml = simplexml_load_string($xmlString);
var_dump((string)$xml);

/*
 * outputs:
 * string(37) "
 *
 *        text text text
 *    "
 */

(无需通过LIBXML_NOCDATA