2013-03-25 41 views
0

這是我的代碼:在XML節點值轉換特殊字符,以簡單的字符,並保存爲XML文件

<?php 
$dom = new DOMDocument(); 
$dom->load('http://services.gisgraphy.com/geoloc/search?lat=22.298569900000000000&lng=70.794301799999970000&radius=7000', true); 
$dom->save('filename.xml'); 
?> 

我收到此類型的輸出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<results xmlns="http://gisgraphy.com"> 
    <numFound>1</numFound> 
    <QTime>67</QTime> 
    <result> 
     <distance>1139.81967842778</distance> 
     <name>Rājkot</name>// 
     <adm1Code>09</adm1Code> 
     <adm1Name>State of Gujarāt</adm1Name> 
     <asciiName>Rajkot</asciiName> 
     <countryCode>IN</countryCode> 
     <featureClass>P</featureClass> 
     <featureCode>PPL</featureCode> 
     <featureId>1258847</featureId> 
     <gtopo30>139</gtopo30> 
     <population>1177362</population> 
     <timezone>Asia/Kolkata</timezone> 
     <lat>22.299999237060547</lat> 
     <lng>70.78333282470703</lng> 
     <placeType>City</placeType> 
     <oneWay>false</oneWay> 
     <length>0.0</length> 
     <google_map_url>http://maps.google.com/maps?f=q&amp;amp;ie=UTF-8&amp;amp;iwloc=addr&amp;amp;om=1&amp;amp;z=12&amp;amp;q=R%C4%81jkot&amp;amp;ll=22.329999237060548,70.78333282470703</google_map_url> 
     <yahoo_map_url>http://maps.yahoo.com/broadband?mag=6&amp;amp;mvt=m&amp;amp;lon=70.78333282470703&amp;amp;lat=22.299999237060547</yahoo_map_url> 
     <country_flag_url>/images/flags/IN.png</country_flag_url> 
    </result> 
</results> 

在上面的XML文件我想將name節點值中的特殊字符轉換爲簡單字符,例如Rājkot包含特殊字符ā,我想將其轉換爲簡單的a字符。

+1

請出示輸入XML數據,你想 – DaveRandom 2013-03-25 09:58:39

+2

輸出XML格式也許我失去了一些東西,但是你爲什麼XML轉換成數組,如果你確實需要它作爲XML? – Uby 2013-03-25 09:58:53

+0

@你是正確的這個鏈接也給我的XML文件,但我想保存這個XML文件,並在他們有一個節點的名稱'name'那裏的值是'Rajkot'這個值的內容像'Rajkot'一些特殊的字符'a'檢查它... – 2013-03-25 10:02:23

回答

1

下面的代碼使用SimpleXML擴展來遍歷每個result元素,並通過執行字符集轉換爲UTF-8來修改其中name元素的文本內容。

<?php 
    $results = new SimpleXMLElement('http://services.gisgraphy.com/geoloc/search?lat=22.298569900000000000&lng=70.794301799999970000&radius=7000', NULL, TRUE); 
    foreach($results->result as $result) { 
    $result->name = iconv('utf-8', 'ascii//TRANSLIT', $result->name); 
    } 
    $results->asXML('results_simple.xml'); 
?> 

下面是使用的DOMDocument代替SimpleXML的上面的代碼的替代版本...

<?php 
    $doc = new DOMDocument(); 
    $doc->load('http://services.gisgraphy.com/geoloc/search?lat=22.298569900000000000&lng=70.794301799999970000&radius=7000'); 
    // retrieve all elements with a tag name of "name" 
    $names = $doc->getElementsByTagName('name'); 
    foreach($names as $name) { 
    $name->nodeValue = iconv('utf-8', 'ascii//TRANSLIT', $name->nodeValue); 
    } 
    $doc->save('results_dom.xml');  
?> 

最後,該代碼使用的DOMDocument遞歸通過在XML數據的所有元素/節點遍歷,將轉換應用於每個文本節點的值...

<?php 
    function convertNodeValueChars($node) { 
    if ($node->hasChildNodes()) { 
     foreach ($node->childNodes as $childNode) { 
     if ($childNode->nodeType == XML_TEXT_NODE) { 
      $childNode->nodeValue = iconv('utf-8', 'ascii//TRANSLIT', $childNode->nodeValue); 
     } 
     convertNodeValueChars($childNode);   
     } 
    }  
    } 

    $doc = new DOMDocument(); 
    $doc->load('http://services.gisgraphy.com/geoloc/search?lat=22.298569900000000000&lng=70.794301799999970000&radius=7000'); 
    convertNodeValueChars($doc->documentElement); 
    $doc->save('results_dom.xml');  
?> 

您在發佈之前是否搜索過類似的問題?

我發現了一些相關問題有一個簡單的谷歌搜索PHP編輯XML元素值 ...

爲了字符轉換,看看這個建議...

+0

不錯,但我有很多節點那些包含特殊字符像'古傑拉特'我想你不標記這? – 2013-03-25 10:33:39

+0

那麼爲什麼在這裏每一個'NewName'都是不可能的,所以我們需要一些東西找到''並且轉換成'a'而不是全名... – 2013-03-25 10:37:30

+0

我發佈的是一個如何改變'name'元素的例子在每個'result'元素中。找到關於如何轉換角色的建議並不難 - 請參閱我的編輯。 – w5m 2013-03-25 10:39:24