2012-09-08 74 views
1

進出口數據嘗試使用下面的PHP腳本來保存一些數據到一個XML文件:PHPヶ輛和保存在XML格式

<?php 

$string = '<a href="google.com/maps">Go to google maps</a> and some special characters ë è & ä etc.'; 

$string = htmlentities($string, ENT_QUOTES, 'UTF-8'); 

$doc = new DOMDocument('1.0', 'UTF-8'); 
$doc->preserveWhiteSpace = false; 
$doc->formatOutput = true; 

$root = $doc->createElement('top'); 
$root = $doc->appendChild($root); 

$title = $doc->createElement('title'); 
$title = $root->appendChild($title); 

$id = $doc->createAttribute('id'); 
$id->value = '1'; 
$text = $title->appendChild($id); 

$text = $doc->createTextNode($string); 
$text = $title->appendChild($text); 

$doc->save('data.xml'); 

echo 'data saved!'; 

?> 

我使用ヶ輛所有的字符串轉換成HTML格式,如果我離開這個特殊字符將不會被翻譯成html格式。這是輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<top> 
    <title id="1">&amp;lt;a href=&amp;quot;google.com/maps&amp;quot;&amp;gt;Go to google maps&amp;lt;/a&amp;gt; and some special characters &amp;euml; &amp;egrave; &amp;amp; &amp;auml; etc.</title> 
</top> 

html標籤得到雙重的HTML代碼的符號:&amp;lt;和符號變爲:&amp;amp;

這是正常的行爲呢?或者我怎樣才能防止這種情況發生?看起來像一個雙重編碼。

回答

3

試着刪除行:因爲傳遞給一個createTextNode()文本無論如何逃脫

$string = htmlentities($string, ENT_QUOTES, 'UTF-8'); 

更新: 如果你想utf-8字符被轉義。你可以離開這條線,並嘗試直接在createElement()中添加$ string。

例如:

$title = $doc->createElement('title', $string); 
$title = $root->appendChild($title); 

在PHP documentation它說,$字符串將不被轉義。我沒有嘗試過,但它應該工作。

+0

當我刪除該行時,特殊字符不會轉換爲HTML代碼。就像'必須變成ë如果我離開那條線,你知道如何做到這一點嗎? – Daniel

+0

我已經更新了我的回答 –

+0

Thx您的回覆!如果我直接添加它,你的權利它不會逃避字符串。但是現在我有一個XML解析錯誤:未定義的實體,因爲它不能將ë保存在字符串中。 – Daniel

2

它是把一個&&amp; 當處理XML數據,你不應該使用ヶ輛,作爲DOM文檔將處理&,而不是&amp;htmlentities

從php 5.3開始,默認編碼是UTF-8,所以不需要轉換爲UTF-8。

+0

Thx用於說明DOMDocument! – Daniel

2

這條線:

$string = htmlentities($string, ENT_QUOTES, 'UTF-8'); 

...字符串編碼爲HTML。

這條線:

$text = $doc->createTextNode($string); 

...編碼的HTML的字符串作爲XML。

這給你一個HTML字符串的XML表示。當XML被解析時,你會返回HTML。

how can I prevent this from happening?

如果您的目標是在XML文檔中存儲一些文本。刪除將其編碼爲HTML的行。

Looks like a double encoding.

很多。它被編碼了兩次,它爲兩次遍歷中的每一次都使用了不同的(儘管非常相似)編碼方法。

+0

Thx爲您解釋。 – Daniel