2017-06-22 51 views
0

當我解析XML文檔時,我需要保存<![CDATA[]]>標記。SimpleXML:在節點值中處理CDATA標記

例如,我有節點:

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

在XML文件可以是不具有本CDATA節點。

然後我處理在循環中的所有節點:

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

其結果是,當我處理節點例如上文 - $nodeValue = some text...

但我需要$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

你需要看看什麼是「內部XML」這個元素,這是棘手的SimpleXML中(->asXML()會給你的「外部XML」,例如<Dest><![CDATA[some text...]]></Dest>)的。

你這裏最好的辦法是使用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的元素,你可以這樣做:

$dom = simplexml_load_file($path); 
foreach($dom->children() as $child) { 
    if(strpos((string) $child,'CDATA')){ 
     $nodeValue = (string) $child; 
    } 
} 

與你將有$nodeValue = '<![CDATA[some text...]]>'

,如果你想不CDATA元素,並添加它,你可以這樣做:

$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哦,你有一個xml文件,其中一些值是'<![CDATA [some text ...]]>'並且你的算法刪除了CDATA? –