Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как узнать кодировку SimpleXMLElement
Форумы портала PHP.SU » » Кодировки и все смежное » Как узнать кодировку SimpleXMLElement

Страниц (2): [1] 2 »
 

1. HDMan - 02 Августа, 2012 - 08:05:17 - перейти к сообщению
имеем следующий код
PHP:
скопировать код в буфер обмена
  1.  
  2. $xmlstr_win = <<<XML
  3. <?xml version="1.0" encoding="cp1251"?>
  4. <rss version="2.0">
  5.   <channel>
  6.     <title>CHANEL TITLE</title>
  7.     <link>http://site.ru/index.html</link>
  8.     <description>CHANEL DESCRIPTION</description>
  9.     <item>
  10.       <title>ITEM TITLE</title>
  11.       <link>http://site.ru/link.php</link>
  12.       <description>ITEM DESCRIPTION</description>
  13.     </item>
  14.   </channel>
  15. </rss>
  16. XML;
  17.  
  18. $xmlstr_utf = <<<XML
  19. <?xml version="1.0" encoding="utf-8"?>
  20. <rss version="2.0">
  21.   <channel>
  22.     <title>CHANEL TITLE</title>
  23.     <link>http://site.ru/index.html</link>
  24.     <description>CHANEL DESCRIPTION</description>
  25.     <item>
  26.       <title>ITEM TITLE</title>
  27.       <link>http://site.ru/link.php</link>
  28.       <description>ITEM DESCRIPTION</description>
  29.     </item>
  30.   </channel>
  31. </rss>
  32. XML;
  33. $xml_win = simplexml_load_string($xmlstr_win);
  34. $xml_utf = simplexml_load_string($xmlstr_utf);
  35. echo '<h1>Читабельная информация о объектах $xml_win и $xml_utf <br>' ;
  36. echo (print_r($xml_win,true)==print_r($xml_utf,true)) ? 'СОВПОДАЕТ':'РАЗЛИЧАЕТСЯ';
  37. echo '</h1>
  38. WIN<textarea>'.$xml_win->asXML().'</textarea>
  39. UTF<textarea>'.$xml_utf->asXML().'</textarea>
  40. OBJECT<textarea>'.print_r($xml_utf,true).'</textarea>';
  41.  

на выходе получаем
CODE (html):
скопировать код в буфер обмена
  1. <h1>Читабельная информация о объектах $xml_win и $xml_utf <br>СОВПОДАЕТ</h1>
  2. WIN<textarea><?xml version="1.0" encoding="cp1251"?>
  3. <rss version="2.0">
  4.   <channel>
  5.     <title>CHANEL TITLE</title>
  6.     <link>http://site.ru/index.html</link>
  7.     <description>CHANEL DESCRIPTION</description>
  8.     <item>
  9.       <title>ITEM TITLE</title>
  10.       <link>http://site.ru/link.php</link>
  11.       <description>ITEM DESCRIPTION</description>
  12.     </item>
  13.   </channel>
  14. </rss>
  15. </textarea>
  16. UTF<textarea><?xml version="1.0" encoding="utf-8"?>
  17. <rss version="2.0">
  18.   <channel>
  19.     <title>CHANEL TITLE</title>
  20.     <link>http://site.ru/index.html</link>
  21.     <description>CHANEL DESCRIPTION</description>
  22.     <item>
  23.       <title>ITEM TITLE</title>
  24.       <link>http://site.ru/link.php</link>
  25.       <description>ITEM DESCRIPTION</description>
  26.     </item>
  27.   </channel>
  28. </rss>
  29. </textarea>
  30. OBJECT<textarea>SimpleXMLElement Object
  31. (
  32.     [@attributes] => Array
  33.         (
  34.             [version] => 2.0
  35.         )
  36.  
  37.     [channel] => SimpleXMLElement Object
  38.         (
  39.             [title] => CHANEL TITLE
  40.             [link] => http://site.ru/index.html
  41.             [description] => CHANEL DESCRIPTION
  42.             [item] => SimpleXMLElement Object
  43.                 (
  44.                     [title] => ITEM TITLE
  45.                     [link] => http://site.ru/link.php
  46.                     [description] => ITEM DESCRIPTION
  47.                 )
  48.  
  49.         )
  50.  
  51. )
  52. </textarea>

как видите объекты не отличаются, а xml отличается только кодировкой
Вопрос: как определить кодировку файла XML распарсеного в SimpleXML?
(изврат с генерацией xml и уже из него получать кодировку не подходит)
2. Мелкий - 02 Августа, 2012 - 09:37:08 - перейти к сообщению
Для чего вам исходная кодировка?
SimpleXML возвращает только UTF8, если XML в другой кодировке объявлен - сам конвертирует.
http://www.php.net/manual/ru/ref...plexml.php#79258
3. HDMan - 02 Августа, 2012 - 12:24:16 - перейти к сообщению
Мелкий пишет:
Для чего вам исходная кодировка?
SimpleXML возвращает только UTF8, если XML в другой кодировке объявлен - сам конвертирует.
http://www.php.net/manual/ru/ref.simplexml.php#79258
я знаю что в SimpleXML всегда UTF-8. А вот исходный xml может быть любой.
соответственно если я в объект SimpleXMLElement хочу внести изменение, то мне надо знать в какой кодировке будет xml файл.

для примера можете взять файл в utf
распарсить его через SimpleXML, изменить какой нибудь элемент записав в него данные в кодировке cp1251, и опять верните его в xml.
на выходе получите чушь в измененном элементе.
4. Мелкий - 02 Августа, 2012 - 12:31:21 - перейти к сообщению
HDMan пишет:
я знаю что в SimpleXML всегда UTF-8

HDMan пишет:
записав в него данные в кодировке cp1251

И вы удивляетесь, почему в итоге что-то странное? Однако
5. HDMan - 02 Августа, 2012 - 12:36:50 - перейти к сообщению
ну так чтобы знать в какой кодировке туда писать надо знать в какой кодировке там данные.

вот два файла
http://www[dot]runcms[dot]ru/modules/news/cache/news[dot]xml
http://news[dot]yandex[dot]ru/index[dot]rss
я их пропускаю через simplexml_load_file
вопрос: в какой кодировке в каждый файл вносить изменения? Как вы это узнали(посредством PHP, а не зрения )?
6. Мелкий - 02 Августа, 2012 - 12:43:39 - перейти к сообщению
Зачем вам кодировка?
SimpleXML предоставляет только UTF8 интерфейс, инкапсулирует кодировки и в UTF8 и надо работать.
Если исходный XML в cp1251, изменить свойство (используя UTF8), и записать файл обратно - XML будет всё ещё в cp1251 и с корректным cp1251 (если это, конечно, вообще возможно) изменённым свойством.
7. HDMan - 02 Августа, 2012 - 12:45:22 - перейти к сообщению
короче говоря мне нужен код типа этого:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $xml = simplexml_load_file(rawurlencode('http://news.yandex.ru/index.rss'));
  3. $code = КакаятоНеизвестнаяМнеФункция($xml);
  4. $xml->channel->title=mb_convert_encoding('Новое название канала', "utf-8", $code);
  5. $newxml= $xml->asXML(); \\ и этот файл я уже могу записать или сделать с ним еще чегонибудь
  6.  

так вот ищу функцию КакаятоНеизвестнаяМнеФункция или метод для работы с классом или объектом, которая позволит узнать в какой кодировке будет создан файл $newxml
8. Мелкий - 02 Августа, 2012 - 12:47:08 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $xml = simplexml_load_file(rawurlencode('http://news.yandex.ru/index.rss'));
  2. $xml->channel->title='Новое название канала';
  3. $newxml= $xml->asXML(); \\ и этот файл я уже могу записать или сделать с ним еще чегонибудь
9. HDMan - 02 Августа, 2012 - 12:47:55 - перейти к сообщению
Мелкий пишет:

Если исходный XML в cp1251, изменить свойство (используя UTF8), и записать файл обратно - XML будет всё ещё в cp1251 и с корректным cp1251 (если это, конечно, вообще возможно) изменённым свойством.
как узнать посредством PHP в какой кодировке исходный xml?
(Добавление)
Мелкий пишет:
PHP:
скопировать код в буфер обмена
  1. $xml = simplexml_load_file(rawurlencode('http://news.yandex.ru/index.rss'));
  2. $xml->channel->title='Новое название канала';
  3. $newxml= $xml->asXML(); \\ и этот файл я уже могу записать или сделать с ним еще чегонибудь
так будет работать правильно только если кодировка xml и шашего сайта совподают.
если у вас cp1251. а файл на UTF-8. то будут кракозябры.
10. Мелкий - 02 Августа, 2012 - 12:56:00 - перейти к сообщению
HDMan пишет:
так будет работать правильно только если кодировка xml и шашего сайта совподают.

Так будет работать с любой известной SimpleXML кодировкой XML-документа и скриптом в UTF-8.
Если с какого-то перепуга ваш скрипт всё ещё не в UTF8 - это, в общем-то, ваши проблемы. SimpleXML работает в UTF8.
11. HDMan - 02 Августа, 2012 - 13:04:15 - перейти к сообщению
Мелкий пишет:
Так будет работать с любой известной SimpleXML кодировкой XML-документа и скриптом в UTF-8.
вы для начала попробуйте код
PHP:
скопировать код в буфер обмена
  1.     $xml = simplexml_load_file(rawurlencode('http://www.runcms.ru/modules/news/cache/news.xml'));
  2.     $xml->channel->title='Новое название канала';
  3.     $newxml= $xml->asXML(); \\ и этот файл я уже могу записать или сделать с ним еще чегонибудь
подсказка: исходный xml там в cp1251
Мелкий пишет:
Если с какого-то перепуга ваш скрипт всё ещё не в UTF8 - это, в общем-то, ваши проблемы. SimpleXML работает в UTF8.
если вы не знаете ответа на вопрос "как определить кодировку файла XML расперсеного в SimpleXML", то это не дает право хамить
12. Мелкий - 02 Августа, 2012 - 13:16:53 - перейти к сообщению
CODE (text):
скопировать код в буфер обмена
  1. user@brtech-ws-03:~$ cat test.php
  2. <?
  3. $xml = simplexml_load_file('http://www.runcms.ru/modules/news/cache/news.xml');
  4.     $xml->channel->title='Новое название канала';
  5.     $newxml= $xml->asXML();
  6. echo $newxml;
  7. user@brtech-ws-03:~$ php -f test.php | iconv -f cp1251 -t utf8 | head
  8. <?xml version="1.0" encoding="windows-1251"?>
  9. <rss version="2.0">
  10. <channel>
  11. <title>Новое название канала</title>
  12. <link>http://www.runcms.ru/</link>
  13. <description>Русское сообщество RunCms</description>
  14. <language>ru</language>
  15. <copyright>Copyright 2011, RunCms Russian Team</copyright>
  16. <pubDate>Tue, 25 Jan 2011 22:24:19 +0300</pubDate>
  17. <generator>RUNCMS  1.1A </generator>
13. HDMan - 02 Августа, 2012 - 13:20:32 - перейти к сообщению
Вопрос остается открытым: "Как определить кодировку файла XML расперсеного в SimpleXML?"
14. Мелкий - 02 Августа, 2012 - 13:38:18 - перейти к сообщению
HDMan пишет:
Как определить кодировку файла XML расперсеного в SimpleXML?

Невозможно, т.к. simplexml полностью скрывает кодировки, оставляя только UTF8-интерфейс.
Используйте DOMDocument.
15. HDMan - 02 Августа, 2012 - 13:47:55 - перейти к сообщению
Мелкий пишет:
Используйте DOMDocument.
Если знаете, пожалуйста подскажите как это использовать?

 

Powered by ExBB FM 1.0 RC1