1

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

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

问题是,直到有节点“Riconoscimento”simplexml 解析器无法读取 cdata 部分,如果我删除了那个孩子,一切都没有问题。

所以主要的问题是:它是一个有效的 xml 文档,如果它是有效的,是否有某种方法可以使用 php 访问 CDATA 部分而无需手动删除额外的孩子?

提前致谢。

4

2 回答 2

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 转换为文本节点的参数。

于 2009-11-17T10:50:40.863 回答
1

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

定义:CDATA 段可能出现在字符数据可能出现的任何地方;它们用于转义包含字符的文本块,否则这些字符会被识别为标记。CDATA 部分以字符串“”开头,以字符串“ <![CDATA[”结尾 ]]>

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

$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

于 2009-11-17T10:51:22.983 回答