2010-05-18 69 views
2

我遇到一些困難與PHP DOM類。PHP - DOM類 - 實體編號和編碼問題

我想提出一個網站地圖的腳本,我需要的$輸出doc-> saveXML()要像

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <url> 
     <loc>http://www.somesite.com/servi&#xE7;os/redesign</loc> 
    </url> 
</root> 

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <url> 
     <loc>http://www.somesite.com/servi&#231;os/redesign</loc> 
    </url> 
</root> 

,但我得到:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <url> 
     <loc>http://www.somesite.com/servi&amp;#xE7;os/redesign</loc> 
    </url> 
</root> 

這是衣櫃裏我能得到,使用頂替命名編號的實體功能。

我也能夠重現

<?xml version="1.0" ?> 
<root> 
    <url> 
     <loc>http://www.somesite.com/servi&amp;#xE7;os/redesign</loc> 
    </url> 
</root> 

但是,如果沒有指定的編碼。

最好的解決方案(我想的代碼應寫入的方式)將是:

<?php 
$myArray = array(); 
// do some stuff to populate the with URL strings 

$doc = new DOMDocument('1.0', 'UTF-8'); 

// here we modify some property. Maybe is the answer I am looking for... 

$urlset = doc->createElement("urlset"); 
$urlset = $doc->appendChild($urlset); 

foreach($myArray as $address) { 
    $url = $doc->createElement("url"); 
    $url = $urlset->appendChild($url); 

    $loc = $doc->createElement("loc"); 
    $loc = $url->appendChild($loc); 

    $valueContent = $doc->createTextNode($value); 
    $valueContent = $loc->appendChild($address); 
} 

echo $doc->saveXML(); 
?> 

注:

  • 服務器響應報頭包含的字符集爲UTF-8;
  • PHP腳本保存在UTF-8;
  • 網址讀是UTF-8字符串;
  • 上面的腳本包含DOM文檔構造編碼聲明,並且不使用任何轉換功能,如ヶ輛,用urlencode,函數utf8_encode ...

我試圖改變DOM文檔屬性的DOMDocument :: $ resolveExternalsDOMDocument :: $ substituteEntities值。沒有組合的工作。

是的,我知道我可以做所有的過程,而不指定字符的DOM文檔構造函數中設置轉儲字符串內容到一個變量,並用繩子一個非常簡單的字符串替換替換功能。這工作。但我想知道我在哪裏滑倒,如何使用本機API和設置進行此操作,或者即使這是可能的。

在此先感謝。

+0

感謝您的所有意見和答覆。 在進一步閱讀了sitemap協議規範和RFC之後,我得到了一個解決方案。 我正在使用urlencode函數處理URL條目。我意識到的一件事是PHP的內置urlencode函數大部分基於RFC 1738.當前URL RFC是3986. 這裏是我的函數來正確地將URL轉換爲百分比實體。 – Dave 2010-05-19 01:22:24

+0

function myUrlEncode($ string){ \t $ entities = array('%21','%2A','%27','%28','%29','%3B','%3A', '%40','%26','%3D','%2B','%24','%2C','%2F','%3F','%25','%23', '%5B','%5D'); \t $ replacements = array('!','*',「'」,「(」,「)」,「;」,「:」,「@」,「&」,「=」,「+」 ,「$」,「,」,「/」,「?」,「%」,「#」,「[」,「]」); \t return str_replace($ entities,$ replacementments,urlencode($ string)); } – Dave 2010-05-19 01:23:42

回答

0

resolveExternalssubstituteEntities是解析器功能。它們對序列化沒有影響。

XML信息不作任何任何區別之間:

<loc>http://www.somesite.com/serviços/redesign</loc> 
<loc>http://www.somesite.com/servi&#xE7;os/redesign</loc> 
<loc>http://www.somesite.com/servi&#231;os/redesign</loc> 

它們都代表完全相同的信息,任何XML解析器必須把他們當作是相同的,XML序列化通常不會讓你選擇哪個輸出。通常,您應該將文本節點的值設置爲包括ç,並讓串行器將其寫入ç,作爲輸出中的原始UTF-8字節字符串。

如果你真的必須生成一個只包含ASCII一個XML文件,所以你不能像ç直接使用字符,然後告訴PHP使用ASCII作爲文檔編碼:

$s= "serviços"; // or "\xC3\xA7" if you can't input UTF-8 strings directly 

$doc = new DOMDocument('1.0', 'US-ASCII'); 
$doc->appendChild($loc= $doc->createElement('loc')); 
$loc->appendChild($doc->createTextNode($s)); 
echo $doc->saveXML(); 

結果:

<?xml version="1.0" encoding="US-ASCII"?> 
<loc>servi&#231;os</loc> 

但是......說了這麼多,我仍然認爲這是不對的。您的值似乎是一個URL,而非ASCII字符在URL中無效,無論它們在包含的XML中如何編碼。它應該是:

http://www.somesite.com/servi%C3%A7os/redesign 

ie。 rawurlencode('serviços')

+0

感謝您的意見和澄清。 這不完全是我尋找的解決方案,但幫助我很多,導致正確的道路。 – Dave 2010-05-19 01:25:01

0

把它傳遞給一個createTextNode

$valueContent = $doc->createTextNode(html_entity_decode($value, ENT_QUOTES, 'UTF-8')); 

這之前解碼你的實體,因爲&#231;不是UTF-8文檔中的有效實體。所以DomDocument看到&並將其編碼爲& amp;