PHP:SimpleXMLElementで<![CDATA [を処理する方法は?


97

SimpleXMLElementこれらのCDATAタグを含むドキュメントで使用すると、コンテンツは常にであることに気付きましたNULL。どうすれば修正できますか?

また、ここでXMLについてスパムを送信して申し訳ありません。私は今、XMLベースのスクリプトを数時間動作させるように努めています...

<content><![CDATA[Hello, world!]]></content>

「SimpleXMLElement cdata」を検索してGoogleで最初のヒットを試しましたが、うまくいきませんでした。


どのようにノード値にアクセスしようとしていますか?そして、SimpleXMLは要件ですか?
allnightgrocery 2010年

私はWebで見つけることができる他のすべての関数(xml2arrayなど)をすべて試しましたが、CDATAが機能しないことを除いて、SimpleXMLだけが良い結果を与えるようです。
Angelo

1
DOMDocument(php.net/manual/en/class.domdocument.php)を使用して、仕事で多くのXML解析を行っています。CDATAの処理には問題ありません。SimpleXMLをどのように使用しているかを確認するために、コードを短くするか、もう少しコードを投稿してください。
allnightgrocery 2010年

回答:


182

おそらく正しくアクセスしていません。直接出力することも、文字列としてキャストすることもできます。(この例では、エコーはとにかく自動的に行うので、キャストは不要です)

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
);
echo (string) $content;

// or with parent element:

$foo = simplexml_load_string(
    '<foo><content><![CDATA[Hello, world!]]></content></foo>'
);
echo (string) $foo->content;

あなたは幸運かもしれませんLIBXML_NOCDATA

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
    , null
    , LIBXML_NOCDATA
);

2
いいえ、PHPは何らかの理由でCDATAを完全にスキップします。他のアイデアはありますか?
アンジェロ

4
それはバグです。動作するまでPHP / libxmlをアップグレードします(CDATAとSimpleXMLで問題が発生したことはありません。)それ以外の場合は、LIBXML_NOCDATAで運を試してみてください。
ジョシュデイビス

5
これは古い答えですが、この答えの最初の部分が正しいことを強調したいと思いますprint_r実際に結果を印刷すると、実際には正しくアクセスできません。実際に必要なコードを記述します。おそらくecho、または(string)キャストを使用すると、コンテンツに問題がないことがわかります。LIBXML_NOCDATAは使用しないでください。無関係です。
IMSoP 2014

7
@IMSoP LIBXML_NOCDATAの追加(および何も変更しない)は機能するので、それが無関係であるかどうかはわかりません。
rand

3
@SimonePalazzo XMLは、さまざまな異なる「ノード」で構成されています(例:)<anElement>a text node <aChildElement /> <![CDATA a cdata node]]> another text node</anElement>。CDATAノードとテキストノードは異なるタイプであり、SimpleXMLはこれを追跡するため、入力したXMLを取得できます。SimpleXMLオブジェクトを配列に圧縮すると、CDATAノード、コメント、その他の要素ではない多くの情報が破棄されます。現在の名前空間(例:)<someNSPrefix:someElement />では、テキスト内の子要素の位置などにより、LIBXML_NOCDATACDATAノードがテキストノードに変換されますが、残りは修正されません。
IMSoP 2015

48

LIBXML_NOCDATA任意の第三のパラメータでsimplexml_load_file()機能します。これにより、すべてのCDATAデータが文字列に変換されたXMLオブジェクトが返されます。

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA);
echo "<pre>";
print_r($xml);
echo "</pre>";


SimpleXMLのCDATAを修正する


LIBXML_NOCDATAは、これを機能させるものです。PHP 5.3.5
Mike_K 2017

1
あなたの答えはLIBXML_NOCDATAの意味を説明するものです、ありがとう!
Marcio Mazzucato 2017年

14

これは私のためのトリックをしました:

echo trim($entry->title);

cdata(LIBXML_NOCDATAなし)を保持する必要がある場合に最適
maztch

10

これは私にとって完璧に機能しています。

$content = simplexml_load_string(
    $raw_xml
    , null
    , LIBXML_NOCDATA
);

0

いつ使用するのLIBXML_NOCDATAですか?

XMLをJSONに変換するときに問題を追加します。

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
echo json_encode($xml, true); 
/* prints
   {
     "content": {}
   }
 */

SimpleXMLElementオブジェクトにアクセスすると、CDATAが取得されます。

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
echo $xml->content; 
/* prints
   Hello, world!
*/

SimpleXMLElementにアクセスして文字列キャスト機能をトリガーしないLIBXML_NOCDATAので、私は使用するのが理にかなってjson_encodeいます__toString()

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>", null, LIBXML_NOCDATA);
echo json_encode($xml);
/*
 {
   "content": "Hello, world!"
 }
*/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.