2011-07-13 23 views
19

如何使用php DOM獲取<![CDATA [values]] >中的值。 這是從我的XML幾個代碼。如何使用php DOM在<![CDATA [values]]>中獲取值?

 <Destinations> 

     <Destination> 
      <![CDATA[Aghia Paraskevi, Skiatos, Greece]]]]>><![CDATA[ 
      <CountryCode>GR</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Amettla, Spain]]]]>><![CDATA[ 
      <CountryCode>ES</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Amoliani, Greece]]]]>><![CDATA[ 
      <CountryCode>GR</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Boblingen, Germany]]]]>><![CDATA[ 
      <CountryCode>DE</CountryCode> 
     </Destination> 

    </Destinations> 
+0

你們是不是要讀或寫這個XML?無論哪種方式,你真的想要這些加倍CDATA部分,因爲他們發佈? –

+0

我想讀取CDATA中的值。 – Hearaman

回答

31

使用PHP DOM相當簡單,與Javascript的DOM非常相似。

這裏是重要的類:對於任何

  • DOMNode —的基類,可以在XML/HTML文檔中走過,包括文本節點,註釋節點,並CDATA節點
  • DOMElement —基礎類標籤
  • DOMDocument —文檔的基類。包含加載/保存XML的方法以及常規DOM文檔方法(請參見下文)。

有幾個縫釘的方法和屬性:

  • DOMDocument->load() —創建新DOMDocument後,使用該對象上此方法來從文件中加載。
  • DOMDocument->getElementsByTagName() —這個方法返回與給定標記名稱的文檔中的所有元素的節點列表。然後你可以在這個列表上迭代(foreach)。
  • DOMNode->childNodes —節點的所有子節點的節點列表。 (請記住,一個CDATA部分是一個節點!)
  • DOMNode->nodeType —獲取節點的type。 CDATA節點具有類型XML_CDATA_SECTION_NODE,其是與值常數。
  • DOMNode->textContent —獲取任意節點的文本內容。

注意:您的CDATA部分格式不正確。我不知道爲什麼會出現在第一位的,或者在該行的最後一個未關閉CDATA部分額外]],但我認爲它應該僅僅是:

<![CDATA[Aghia Paraskevi, Skiatos, Greece]]> 

把所有這一切我們一起:

  1. 創建一個新的文檔對象並加載XML
  2. 獲取的標記名稱的所有Destination元素和遍歷列表
  3. 遍歷每個的所有子節點元件
  4. 檢查是否節點類型是XML_CDATA_SECTION_NODE
  5. 如果是,echo該節點的textContent

代碼:

$doc = new DOMDocument(); 
$doc->load('test.xml'); 
$destinations = $doc->getElementsByTagName("Destination"); 
foreach ($destinations as $destination) { 
    foreach($destination->childNodes as $child) { 
     if ($child->nodeType == XML_CDATA_SECTION_NODE) { 
      echo $child->textContent . "<br/>"; 
     } 
    } 
} 

結果:

聖帕拉斯凱維,Skiatos,希臘
Amettla,西班牙
阿莫利亞尼島,希臘
伯布林根,德國

+0

Hearaman想要讀取包含CDATA的節點,而不是使用cdata創建節點。 – JellyBelly

+0

@JellyBelly我最初誤解了它。我已經解決了我的答案。 – Nicole

+0

感謝修復Renesis! – JellyBelly

3

使用後解析PHP DOM元素之前更換CDATA你可以得到innerXml或innerHTML的:

str_replace(array('<\![CDATA[',']]>'), '', $xml); 
+0

你應該使用示例代碼完成示例以檢索innerXml或innerHtml ... –

10

使用此:

​​

和未來:

foreach ($parseFile->yourNode as $node){ 
etc... 
} 
+0

儘管在上面的答案中,這個實際上非常有用,特別是對於我們開始使用simplexml進行開發的人員。謝謝! – bbujisic

1

我使用下面的代碼。 它不僅與

<![CDATA[values]] > 

讀取所有的XML數據,而且轉換XML對象到PHP關聯數組。所以我們可以在數據上應用循環。

$xml_file_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA),true), true); 

希望這會對你有用。

2

最簡便的方法

$xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA); 
$xmlJson = json_encode($xml); 
$xmlArr = json_decode($xmlJson, 1); // Returns associative array 
+0

完美答案。 +1 –