【问题标题】:Convert special character to simple character in XML node value and save as XML file将 XML 节点值中的特殊字符转换为简单字符并保存为 XML 文件
【发布时间】:2013-03-25 09:37:18
【问题描述】:

这是我的代码:

<?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 字符。

【问题讨论】:

  • 请显示输入的XML数据和你想要的输出XML格式
  • 也许我遗漏了一些东西,但是如果您确实需要将 XML 转换为数组,为什么还要将它转换为 XML 呢?
  • @Uby 你是对的,这个链接也给了我 xml 文件,但我想保存这个 xml 文件,其中有一个名称为name 的节点,值为Rajkot 这个值内容一些特殊字符,如Rajkot a 检查它...
  • @Uby 我想使用php 输出这个链接,然后忘记上面的一切
  • 而不是像Rājkot 到Rajkot 或Gujarāt 到Gujarat 这样的猜测字符转换;创建一个带有standard_name 列和别名1:n 的别名表并继续更新它。不时使用字符转换工具 (iconv) 进行猜测和手动确认。语音/多语言支持是一项功能,但也是一种负担!

标签: php xml xml-parsing transliteration


【解决方案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 edit xml element value...

为了转换字符,看看这个建议......

【讨论】:

  • 很好,但我有很多节点包含特殊字符,如Gujarāt 我认为你没有标记这个???
  • 那么NewName 是不可能的,所以我们需要找到ā 并转换成a 而不是全名...
  • 我发布的是如何更改每个 result 元素中的 name 元素的示例。不难找到有关如何转换字符的建议 - 请参阅我的编辑。
  • 我已经修改了我的代码示例以包含转换字符的建议。
  • 我添加了一个代码示例,它递归遍历数据中的所有节点并将转换应用于文本节点的值。
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 2011-07-19
  • 2011-06-05
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多