代码之家  ›  专栏  ›  技术社区  ›  Alekc

在同一节点下混合childs和cdata。它有效吗?

  •  1
  • Alekc  · 技术社区  · 15 年前

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

    问题是,在节点“Riconoscimento”simplexml解析器无法读取cdata节之前,如果我删除该子节点,则一切都可以正常工作。

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Greg    15 年前

    你可以这样得到它:

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

        2
  •  1
  •   Stefan Gehrig    15 年前

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

    定义: 可能发生 任何可能出现字符数据的地方; 包含将 否则将被识别为标记。 <![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