JSON в XML с греческими символами - PullRequest
3 голосов
/ 11 августа 2011

Я использую curl, чтобы получить файл json, который может быть расположен здесь: (Копировать и вставлять его слишком долго): http://www.opap.gr/web/services/rs/betting/availableBetGames/sport/program/4100/0/sport-1.json?localeId=el_GR

После этого я использую json_decode, чтобы получить массив ассоциаций.здесь все выглядит нормально. Когда я использую var_dump, символы внутри массива на греческом. После этого я использую следующий код:

    $JsonClass = new ArrayToXML();
    $mydata=$JsonClass->toXml($json);

class ArrayToXML {

public static function toXML( $data, $rootNodeName = 'ResultSet', &$xml=null ) {

    // turn off compatibility mode as simple xml throws a wobbly if you don't.
   // if ( ini_get('zend.ze1_compatibility_mode') == 1 ) ini_set ( 'zend.ze1_compatibility_mode', 0 );
    if ( is_null( $xml ) ) //$xml = simplexml_load_string( "" );
        $xml = simplexml_load_string("<?xml version='1.0' encoding='UTF-8'?><$rootNodeName />");

    // loop through the data passed in.
    foreach( $data as $key => $value ) {

        $numeric = false;

        // no numeric keys in our xml please!
        if ( is_numeric( $key ) ) {
            $numeric = 1;
            $key = $rootNodeName;
        }

        // delete any char not allowed in XML element names
        `enter code here`$key = preg_replace('/[^a-z0-9\-\_\.\:]/i', '', $key);

        // if there is another array found recrusively call this function
        if ( is_array( $value ) ) {
            $node = ArrayToXML::isAssoc( $value ) || $numeric ? $xml->addChild( $key ) : $xml;

            // recrusive call.
            if ( $numeric ) $key = 'anon';
            ArrayToXML::toXml( $value, $key, $node );
        } else {

            // add single node.
            $value = htmlentities( $value );
            $xml->addChild( $key, $value );
        }
    }

    // pass back as XML
    return $xml->asXML();


}
public static function isAssoc( $array ) {
    return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array)))));
}

}

И тут возникает проблема. Все греческие символы внутри результата представлены, например, в каких-то странных символах &Icirc;?&Icirc;?&Icirc;&yen;&Icirc;?&Icirc;?&Icirc;&iexcl;&Icirc;&copy;&Icirc;&pound;&Icirc;?&Icirc;?. Я действительно не знаю, что я делаю неправильно. Я действительно плохо разбираюсь в кодировании / декодированиивещи: (.

И чтобы сделать это немного более ясным:

Вот как выглядит ассоциативный массив (из частей, с которыми у меня есть проблема):

{ ["resources"]=> array(4) { ["team-4833"]=> string(24) "ΛΕΥΚΟΡΩΣΙΑ U21" ["t-429"]=> string(72) "ΠΡΟΚΡΙΜΑΤΙΚΑ ΕΥΡΩΠΑΪΚΟΥ ΠΡΩΤΑΘΛΗΜΑΤΟΣ" ["t-429-short"]=> string(6) "ΠΕΠ" ["team-15387"]=> string(16) "ΕΛΛΑΔΑ U21" } ["locale"]=> string(5) "el_GR" } ["relatedNum"]=> NULL }

А вот что я получаю после использования simplexml

<resources><team-4833>&Icirc;?&Icirc;?&Icirc;&yen;&Icirc;?&Icirc;?&Icirc;&iexcl;&Icirc;&copy;&Icirc;&pound;&Icirc;?&Icirc;? U21</team-4833><t-429>&Icirc;&nbsp;&Icirc;&iexcl;&Icirc;?&Icirc;?&Icirc;&iexcl;&Icirc;?&Icirc;?&Icirc;?&Icirc;&curren;&Icirc;?&Icirc;?&Icirc;? &Icirc;?&Icirc;&yen;&Icirc;&iexcl;&Icirc;&copy;&Icirc;&nbsp;&Icirc;?&Icirc;&ordf;&Icirc;?&Icirc;?&Icirc;&yen; &Icirc;&nbsp;&Icirc;&iexcl;&Icirc;&copy;&Icirc;&curren;&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;&curren;&Icirc;?&Icirc;&pound;</t-429><t-429-short>&Icirc;&nbsp;&Icirc;?&Icirc;&nbsp;</t-429-short><team-15387>&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;? U21</team-15387></resources><locale>el_GR</locale></lexicon><relatedNum></relatedNum></betGames>

Заранее спасибо за ваши ответы.

PS: У меня также есть <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> на странице, которую яотобразить результат, но это не помогает.


Я все ещеЯ не нашел решения с этим, поэтому я использовал другой подход, предложенный Яннисом. Я сохранил XML в файле, используя класс, который нашел здесь http://www.phpclasses.org/package/1826-PHP-Store-associative-array-data-on-file-in-XML.html.

После этого я загружаюxml с simplexml_load_file, и я использовал xslt для доступа к данным во всех узлах и сохранения их в моей базе данных. Это работало нормально. Если кто-то все еще хочет попытаться объяснить мне, почему это не работает так, как я пытался это сделатьв начале не стесняйтесь (только для учебной цели: p) Спасибо за ваши ответы:).

Ответы [ 4 ]

1 голос
/ 13 августа 2011

В этом нет необходимости - текущий json также указан в формате xml:

http://www.opap.gr/web/services/rs/betting/availableBetGames/sport/program/4100/0/sport-1.xml?localeId=el_GR

Просто пришлось немного поиграть с параметрами url:)

0 голосов
/ 26 августа 2011

ответ на ваш вопрос из ГРЕЦИИ --------- слово "? [ΛΕΥΚΟ]"? он имеет ASC (его кодовый символ) 203-197-213-202-207 () ---------- когда же вы читаете ему [простите] 206 и удваиваете буквы ---------- но также измените код следующим образом 206- (203-48 = 155) -206- (197-48 = 149) -206- (213-48 = 165) - -206- (213-48 = 165) -206- (202-48 = 154) -206- (207-48 = 159) ------------- следовательно, решение, которое они проверяют на символ, если вы найдете 206, чтобы> игнорировать --------- ему и в ASC следующего персонажа добавить число 48 и найти нового персонажа. > ------------ Потому что я также имею дело с [ΑΠΟΚΟΔΙΚΟΠΟΙΗΣΗ] of [ΟΠΑΠ] каждым новым знанием, которым они являются> [ΕΥΠΡΟΣΔΕΚΤΟ] ------ в почте ->? bluegt03@in.gr

0 голосов
/ 25 августа 2011

Очевидно, что ваша ошибка в том, что вы манипулируете Unicode в кодировке UTF ‑ 8, как если бы эти байты были ISO-8859‑1.

Я не вижу, где это происходит;вероятно, в вашем звонке на htmlentities, что бы это ни было.

Возможно, потребуется использовать своего рода «многобайтовый» хак, возможно, с такими вещами, как этот тип шаблона:

/([^\x00-\x7F])/u

с явным /u, поэтому он работает с логическим кодомточки вместо 8-битных кодовых единиц (читай: байты).Он может сделать это, чтобы получить одну кодовую точку, отличную от ASCII, чтобы заменить ее числовой сущностью.Без легко забываемого /u он будет работать с байтами, а не с кодовыми точками, что соответствует тому, что происходит в вашем описании.

Это может быть что-то в этом роде, или вам может потребоваться переключиться нанекоторые из функций mb_*() вместо обычных.Это сделано для того, чтобы обойти основную ошибку PHP, заключающуюся в том, что в нем нет реальной поддержки Unicode, только несколько бандитов, которые, похоже, время от времени отваливаются без веской причины.

Если бы вы могли использовать чистый язык с не только надлежащей поддержкой Юникода, но и четким разделением между физическими байтами и абстрактными символами, такого рода вещи не происходили бы.Но держу пари, что это распространенная проблема, которая, возможно, возникает и у других, поэтому я был бы очень удивлен, если бы это была ошибка библиотеки вместо (совершенно понятного!) Упущения где-то в вашем коде.

0 голосов
/ 12 августа 2011

Это работало для меня на Chrome с использованием PHP версии 5.3.6:

    $json = file_get_contents('http://www.opap.gr/web/services/rs/betting/availableBetGames/sport/program/4100/0/sport-1.json?localeId=el_GR');
    $json = json_decode($json, true);
    $xml = new SimpleXMLElement('<ResultSet/>');
    array_walk_recursive($json, array ($xml, 'addChild'));
    print $xml->asXML();
    exit();
...