Преобразование специального символа в простой символ в значении узла 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.


person jack lanza    schedule 25.03.2013    source источник
comment
Пожалуйста, покажите входные данные XML и выходной формат XML, который вы хотели бы   -  person DaveRandom    schedule 25.03.2013
comment
Может быть, я что-то упускаю, но зачем вы конвертируете XML в массив, если он вам действительно нужен как XML?   -  person ulentini    schedule 25.03.2013
comment
@Uby, вы правы, эта ссылка также дает мне xml-файл, но я хочу сохранить этот xml-файл, и в нем есть один узел с именемname, там значение Rajkot, это значение содержит какой-то специальный символ, например, в Rajkot a проверьте это ...   -  person jack lanza    schedule 25.03.2013
comment
@Uby, я хочу, чтобы эта ссылка выводилась с помощью php, это возможно, тогда забудьте все вышеперечисленное   -  person jack lanza    schedule 25.03.2013
comment
@DaveRandom то же самое, что и щелчок по ссылке ... но это хорошо для меня, если вы решите мой один запрос по заданному URL-адресу, есть один узел с name, его значение равно Rajkot это значение имеет один специальный символ a я хочу преобразовать в символ .. ., но не забывайте мой собственный вопрос, сохраните данный вывод URL-адреса в виде xml, если не нужно преобразовывать в массив, тогда хорошо...   -  person jack lanza    schedule 25.03.2013
comment
Итак, я прав, говоря, что вы хотите: (а) прочитать XML-данные из URL-адреса, (б) изменить значение элемента name и (в) сохранить измененные XML-данные в файл?   -  person w5m    schedule 25.03.2013
comment
Этот вопрос уже задавался раньше: stackoverflow.com/a/2956678/2047725   -  person w5m    schedule 25.03.2013
comment
@ w5m я нашел решение для сохранения xml из URL-адреса, но теперь что для модифицированного name   -  person jack lanza    schedule 25.03.2013
comment
@w5m проверьте мою модификацию вопроса...   -  person jack lanza    schedule 25.03.2013
comment
Вместо того, чтобы делать предполагаемые преобразования символов, такие как Rājkot в Rajkot или Gujarāt в Gujarat; создайте таблицу псевдонимов с standard_name столбцом и псевдонимами, 1:n и продолжайте обновлять ее. Используйте инструменты преобразования символов (iconv) для догадок и ручную работу для подтверждения время от времени. Поскольку поддержка фонетики/многоязычия является функцией, это также и бремя!   -  person SparKot    schedule 25.03.2013


Ответы (1)


В приведенном ниже коде используется расширение SimpleXML для циклического просмотра каждого элемента result и изменения текстового содержимого элемента name внутри него путем преобразования набора символов в UTF-8.

<?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');     
?>

Вы искали похожие вопросы, прежде чем публиковать здесь?

Я нашел ряд релевантных вопросов с помощью простого поиска в Google по запросу php edit xml element value...

Чтобы преобразовать символы, взгляните на это предложение...

person w5m    schedule 25.03.2013
comment
хорошо, но у меня есть много узлов, которые содержат специальный символ, например Gujarāt, я думаю, вы не отмечаете это ??? - person jack lanza; 25.03.2013
comment
так нафига это везде где есть NewName не возможно поэтому надо что-то найти ā и преобразовать в a не полное имя... - person jack lanza; 25.03.2013
comment
То, что я опубликовал, было примером того, как изменить элемент name в каждом элементе result. Нетрудно найти предложения по конвертации символов — смотрите мою правку. - person w5m; 25.03.2013
comment
Я изменил свой пример кода, включив в него предложение преобразовать символ. - person w5m; 25.03.2013
comment
только одно значение узла, но не для всех работает только name узел, потому что мы установили для foreach... - person jack lanza; 25.03.2013
comment
Если вы говорите, что хотите, чтобы это преобразование символов применялось к другим элементам в элементе result, тогда включите дополнительные строки в цикл foreach; по одному для каждого соответствующего элемента, например. $result->adm1Name. Кажется уместным применить это только к текстовому содержимому 2 или 3 элементов в пределах result. - person w5m; 25.03.2013
comment
да, это временная работа, но нам не нравится этот тип кода, мы хотим найти решение для этого... - person jack lanza; 25.03.2013
comment
Я добавил пример кода, который рекурсивно проходит через все узлы в данных и применяет преобразование к значениям текстовых узлов. - person w5m; 25.03.2013