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

发布于 2024-08-11 15:33:37 字数 503 浏览 7 评论 0原文

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

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

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

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

提前致谢。

I need to parse the following xml document (which is coming from external web service):

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

The problem is that until there is node "Riconoscimento" simplexml parser fails to read cdata section, if i remove that child, everything is working without problems.

So the main question is: is it a valid xml document, and if it's valid is there some way to access CDATA section with php without manually removing extra childs?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

姐不稀罕 2024-08-18 15:33:37

您可以这样获取它:

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

You can get it like this:

$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);

Note the LIBXML_NOCDATA parameter to convert the CDATA to a text node.

唐婉 2024-08-18 15:33:37

首先:这是一个有效的 XML 文档(请参阅 这里)。

定义:CDATA 部分可能会出现
任何可能出现字符数据的地方;
它们用于转义文本块
包含的字符将
否则将被识别为标记。
CDATA 部分以字符串“开始
" 并以字符串 " 结尾
]]>“:


在您的情况下, 元素是混合内容元素。

$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 )

First of all: this is a valid XML document (see here).

Definition: CDATA sections may occur
anywhere character data may occur;
they are used to escape blocks of text
containing characters which would
otherwise be recognized as markup.
CDATA sections begin with the string "
<![CDATA[ " and end with the string "
]]> ":

In your case the <data/>-element is a mixed-content 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
 *    "
 */

(there is no need to pass LIBXML_NOCDATA)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文