PHP+XML

voituk

прозревший
PHP+XML

Есть XML-файл
Код:
<?xml version="1.0" encoding="Windows-1251"?>
<page>
  ...
  <comments>
    <item who="11" email="222" timestamp="1092221455">333</item>
    <item who="222" email="22" timestamp="1092221471">33322</item>
...
  </comments>
</page>
Разбираю его с помошью DOM API.
При получении значений приходится выполнять 
[PHP]iconv('UTF-8', 'Windows-1251', $value)[/PHP]

Но при создании узла в xml-дереве, выполняю
[PHP]iconv( 'Windows-1251', 'UTF-8', $newvalue)[/PHP]

Записываю DOM-дерево в файл
Но теперь каждый кирилический символ в значениях выглядит так \&\#\x\4\3\2\; (слеши доставил чтоб браузер не обратывал их как сущности)

Как мне получить в файле нормальный текст, чтоб xml-файлы нормально редактировались человеком.
 

voituk

прозревший
Дело в том что при получении данных из DOM-дерева они возвращаются в UTF-8.
И при выводе, на странице получается что-то типа
Код:
РўРчР+С_ С'Р_РРч! Р_С_С'Р°С'Рё! РЇР< С%Р°С_
-~{}~ 11.08.04 16:25:

Только что заметил что кирилические значения преобразуются в html-entities только если их указывать в аттрибутах xml-тега
например:
Фрагмент из файла:
Код:
<item who="\&\#\x412\;\&\#\x430;\&\#\x434\;\&\#x438\;\&\#\x43C\;" email="[email protected]" timestamp="1092226980">
Привет это тест!
</item>
Кто с таким сталкивался?
 

Voldar

Новичок
В заголовке xml должно стоять
Код:
encoding="windows-1251"
тогда при получении
Код:
iconv("UTF-8", "windows-1251", $node->node_value())
и при записи
Код:
$new_node->set_attribute($key, iconv('CP1251', 'UTF-8', $val)))
с аттрибутами все нормально. При сохранении в файле получаем текст в 1251-кодировке. У меня такая штука уже больше года работает без нареканий.
 

voituk

прозревший
Делаю полностью аналогично, но если значение атрибута - кирилическая стока, всё-равно получаем что-то вроде
Код:
<item who="\&\#\x422\;\&\#\x435\;\&\#\x441\;\&\#\x442\;"> привет</item>
/только без слешей/

для записи в файл использую
PHP:
 $str = $DomDocument->dump_mem(true,'Windows-1251');
А потом эту строку пишу в файл
 

jahson

Guest
Автор оригинала: voituk
Делаю полностью аналогично, но если значение атрибута - кирилическая стока, всё-равно получаем что-то вроде
Код:
<item who="\&\#\x422\;\&\#\x435\;\&\#\x441\;\&\#\x442\;"> привет</item>
/только без слешей/

для записи в файл использую
PHP:
 $str = $DomDocument->dump_mem(true,'Windows-1251');
А потом эту строку пишу в файл
Возвращается все в утф8, поэтому атрибуты с русским текстом обрабатывать перед применением этой функцией
PHP:
function utf8win1251($s)
{
	$out="";
	$c1="";
	$byte2=false;
	for ($c=0;$c<strlen($s);$c++)
	{
		$i=ord($s[$c]);
		if ($i<=127) $out.=$s[$c];
		if ($byte2)
		{
			$new_c2=($c1&3)*64+($i&63);
			$new_c1=($c1>>2)&5;
			$new_i=$new_c1*256+$new_c2;
			if ($new_i==1025)
			{
				$out_i=168;
			}
			elseif ($new_i==1105)
			{
				$out_i=184;
			}
			 else $out_i=$new_i-848;
			$out.=chr($out_i);
			$byte2=false;
		}
		if (($i>>5)==6)
		{
			$c1=$i;
			$byte2=true;
		}
	}
	return $out;
}
 

jahson

Guest
Автор оригинала: neko
господи сколько мучений у людей из-за этого ДОМа
Сомнений нет, msxml лучше.
Да и проблема даже не в DOMе, а в том, что наиболее используемая кодировка у нас - виндоз-1251 вместо уникода. Или в libxml - кому где больше проблема видится.
 

neko

tеam neko
да ну из php с COM работать это еще больший головняк :)

мне просто другое тут удивляет
зачем вообще лезть в дерево

наверное я что-то принципиально непонимаю в том, как народ юзает xml/xslt
 

jahson

Guest
Бывают случаи, когда без дерева не обойдешься.
Другое дело как это дерево обработать:D
Мсхмл - ну что поделаешь. Некросы придерживаются своей политики строго и все их произведения яростно вожделеют видеть win на компьютере.
 

neko

tеam neko
Бывают случаи, когда без дерева не обойдешься.
приведи пример когда нужно делать какие операции над деревом вот таким образом
я совершенно искренне этого не понимаю

у меня все использование технологии ограничивается конкатенцией элементов, с последующим натравливанием xslt процессора на резльутат
 

jahson

Guest
Например я обновляю базу данных через xml. Можно и без него, но это требование. Мне не нужен в данном случае xslt процессор.

Видимо люди не очень хорошо видят, КАК использовать xml+xslt.
Заведи тему, дай подробные объяснения, аргументы почему лучше делать ТАК. Я тоже с удовольствие почитаю.
 

neko

tеam neko
Например я обновляю базу данных через xml. Можно и без него, но это требование. Мне не нужен в данном случае xslt процессор.
как это не нужен
как раз нужен
чтобы из дерева получить sql операторы

он для того и создан этот xslt чтобы делать преобразования из одной формы в другую
 

jahson

Guest
Буду знать.
Я знаю, для чего нужен xslt, но не пользовался им в своей недолгой практике. Пойду интересоваться.
 

neko

tеam neko
а какой смысл в xml без процессора :)
все равно чистое дерево представляет чисто академический интерес
 

voituk

прозревший
Originally posted by neko
а какой смысл в xml без процессора :)
все равно чистое дерево представляет чисто академический интерес
Приведу конкретный пример, побудивший проблему, описанную в начале topic-а:

Web-галерея без БД с возможностью рамещения рисунков галереи на других сайтах без лишних телодвижений со стороны хазяина сайта.
+ необходимо хранить все данные в "нормальном", читабельном виде, дабы администратор мог их вручную редактировать.

Зачем мне тут XSLT? :)
Возможно можно было бы и придумать архитектуру поинтересней, но ещё проблемма в том, что сайт написан с использованием только SSI. Мелких ограничений по этому поводу возникает просто немеряно.

-~{}~ 16.08.04 11:46:

Originally posted by neko
мне просто другое тут удивляет
зачем вообще лезть в дерево
А как редактировать и создавать элементы дерева?
Как добавлять данные в XML-файл?
Или я что-то неправильно в твоей реплике понял?
 

neko

tеam neko
Зачем мне тут XSLT?
интересно
а как ты выводишь эти вот данные в браузер?
разибраешь в ДОМе все элементы?

А как редактировать и создавать элементы дерева?
Как добавлять данные в XML-файл?
конкатенацей перед отдачей процессору
видишь ли данные как правило существуют ДО того как запустился скрипт
галлерея уже существует, база уже существует, файл уже есть
какие-то сложные манипуляции с деревом ненужны

Или я что-то неправильно в твоей реплике понял?
незнаю
у меня создается ощущение что ты ничего не понял в технологии
могу ошибаться конечно
 

voituk

прозревший
Originally posted by jahson
Возвращается все в утф8, поэтому атрибуты с русским текстом обрабатывать перед применением этой функцией
PHP:
function utf8win1251($s)
{
...
}
Да с приминением атрибутов проблемм нету.
Мне надо чтоб внутри файлов, в каких я храню дерево, атрибуты имели вид, чтоб их можно было свободно читать и редактировать в редакторе.
 

voituk

прозревший
Originally posted by neko
интересно
а как ты выводишь эти вот данные в браузер?
разибраешь в ДОМе все элементы?
В данном конкретном случае приходится. :-(

конкатенацей перед отдачей процессору
видишь ли данные как правило существуют ДО того как запустился скрипт
галлерея уже существует, база уже существует, файл уже есть
какие-то сложные манипуляции с деревом ненужны
Что-то я не понимаю твою терминологию.
Конкатенация чего? Дописывать в файл что-ли? А редактировать как?

незнаю
у меня создается ощущение что ты ничего не понял в технологии
могу ошибаться конечно
Вполне возможно. Если есть желание и время - разъясни.
В моём понимании ДОМ на php - извращение ;-)

-~{}~ 16.08.04 12:19:

Originally posted by neko
voituk
вот скажи что у тебя за редактор такой
Понимаю к чему ты клонишь, но тут играет роль не мой редактор, а редактор человека, какой это будет администрировать. А у него notepad. :-(
P.S. У меня JEdit :)
 
Сверху