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_NOCDATACDATA をテキスト ノードに変換するパラメータに注意してください。

于 2009-11-17T10:50:40.863 に答える
1

まず第一に、これは有効な XML ドキュメントです (ここを参照)。

定義: 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

于 2009-11-17T10:51:22.983 に答える