2017-06-22 3 views
0

XML文書を解析するときに<![CDATA[]]>タグを保存する必要があります。SimpleXML:ノード値のCDATAタグの存在を処理する

例えば、Iノードを有する:XMLファイルで

<Dest><![CDATA[some text...]]></Dest> 

はCDATAすることなく、本ノードであってもよいです。

そしてIは、ループ内のすべてのノード処理:私は上記の例では、ノードを処理するとき、結果として

$dom = simplexml_load_file($path); 
foreach($dom->children() as $child) { 
$nodeValue = (string) $child; 
} 

を - = some text...$nodeValue

しかし、私はあり$nodeValue = <![CDATA[some text...]]>

が必要これを行う方法は何ですか?

ファイル例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Root> 
    <Params> 
    <param>text</param> 
    <anotherParam>text</anotherParam> 
    </Params> 
    <Content> 
    <String> 
     <Source>some another text</Source> 
     <Dest>some another text 2</Dest> 
    </String> 
    <String> 
     <Source>some another text 3</Source> 
     <Dest><![CDATA[some text...]]></Dest> 
    </String> 
    </Content> 
</Root> 
+0

XMLファイルの例を挙げることはできますか? –

答えて

0

を持ってウィルSimpleXMLのようなパーサは、<![CDATA[はXML要素のテキストコンテンツの一部ではなく、そのコンテンツのシリアライゼーションの一部に過ぎません。同様の混乱は、ここで議論されている:あなたが見に必要なものPHP, SimpleXML, decoding entities in CDATA

はSimpleXMLの中にトリッキーであるその要素の「内部XML」は、(->asXML()は例えば<Dest><![CDATA[some text...]]></Dest>、あなたの「外側XML」を与える)です。ここ

あなたの最善の策は、むしろあなたコンテンツを与えるしようとするよりも、あなたの文書の詳細構造へのより多くのアクセスを与えるthe DOMを使用することです区別ので、「テキストノード」と「CDATAノード」。しかし、ユースケースの99.9%は誰かが<foo>bar &amp; baz</foo>または<foo><![CDATA[bar & baz]]></foo>を送ったかどうかは、同じ文字列を定義しているので、実際にはこれが必要かどうかを二重チェックする価値があります。

0

あなたはそれを持っていないすべての要素にCDATAを追加したい場合は、あなたがそれを行うことができます。それと

$dom = simplexml_load_file($path); 
foreach($dom->children() as $child) { 
    if(strpos((string) $child,'CDATA')){ 
     $nodeValue = (string) $child) 
    } 
    else { 
     $nodeValue = "<![CDATA[".((string) $child)."]]>"; 
    } 
} 

あなたは$nodeValue = '<![CDATA[some text...]]>'

を持っています

CDATAが存在する場所に要素を配置したい場合は、

それと

あなたはCDATAなしに要素をしたいとあなたがそれを行うことができ、それを追加した場合$nodeValue = '<![CDATA[some text...]]>'

を持っています。それと

$dom = simplexml_load_file($path); 
foreach($dom->children() as $child) { 
    if(!strpos((string) $child,'CDATA')){ 
     $notValue ="<![CDATA[".((string) $child)."]]>"; 
    } 
} 

をあなたは限り$nodeValue = '<![CDATA[some another text 3]]>'

+0

xmlファイル内にCDATAなしのノードが存在する可能性があります –

+0

CDATAを持っていなければならないことをどうやって知っていますか? –

+0

@AndrewAndrewああ、あなたは値の一部が '<![CDATA [some text ...]]>'であるxmlファイルを持っていて、あなたのalgoでCDATAを削除しますか? –

関連する問題