Проблема с DOMDocument->saveHTML()

Azy

Новичок
Проблема с DOMDocument->saveHTML()

Имеется код:
PHP:
$xsl = new DomDocument('1.0', 'cp1251'); 
$xsl->loadXML($this->xslt); 
$inputdom = new DomDocument('1.0', 'cp1251'); 
$inputdom->loadXML($this->xml); 
			
$proc = new XsltProcessor(); 
$xsl = $proc->importStylesheet($xsl); 

$newdom = $proc->transformToDoc($inputdom); 
echo $newdom->saveHTML();
Все данные в windows-1251.

Последняя команда возвращает готовый HTML. Но! Русские буквы заменены на их HTML коды
("Клубы, казино"->"Клубы, казино")

Если же делать $newdom->saveXML();
то все отлично - возвращает нормальный текст в XML.

Как заставить его парсить и делать saveHTML с нормальными русскими буквами?
 

nimistar

Новичок
Вопрос актуален ....
уже неделю мучаюсь .... (или больше если расматривать и те проекты в которых пришлось от ДОМ отказатся из-за этой бяки)
 

Scud

Новичок
А если делать всё в UTF-8, результат saveHTML() пропускать через iconv?
 

nimistar

Новичок
теги умирают :)

и потом опытным путем установленно
вообщем так :


$DOM = new DOMDocument('1.0','UTF-8');
$DOM->validateOnParse = true;
$DOM->encoding="UTF-8";
$HTML=file_get_contents('tpl/main.tpl');//<meta http-equiv="Content-Type" content="text/html"/><meta http-equiv="Character" content="Windows-1251"/>
if($DOM->loadHTML($HTML)){
$NodeHead=$DOM->getElementsByTagName("head");
$NodeMeta=$DOM->createElement('meta');
$NodeMeta->setAttribute ("http-equiv","Character");
$NodeMeta->setAttribute ("content","UTF-8");
$NodeHead->item(0)->insertBefore($NodeMeta,$NodeHead->item(0)->firstChild);
$NodeMeta=$DOM->createElement('meta');
$NodeMeta->setAttribute ("http-equiv","Content-Type");
$NodeMeta->setAttribute ("content","text/html; charset=UTF-8");
$NodeHead->item(0)->insertBefore($NodeMeta,$NodeHead->item(0)->firstChild);

$NodeByID="content";
if(getElmentById($DOM,$NodeByID)){
$Cont=CONTENT();
$dom2= new DOMDocument('1.0','UTF-8'); ///'1.0','windows-1251' ISO-8859-1
$dom2->validateOnParse = true;
$dom2->encoding="UTF-8";
$dom2->loadHTML($Cont);
$dom2->encoding="UTF-8";
$NodeList=$dom2->getElementsByTagName("body");
$NodeList=$NodeList->item(0)->childNodes;
foreach($NodeList as $CHNode){
$NND=$DOM->importNode($CHNode,TRUE);
$NodeByID->appendChild($NND);
}
$DOM->encoding="ISO-8859-1";
PRINT $DOM->saveHTML();
}else{
print "<b>Error HTML document! Not found node by ID='$NodeByID'</b>";
}

}else{
print "<b>Error open HTML document!</b>";

}


вот тут все чарсеты просто пофих .... главный последний ....
он может быть таким и никаким другим ... (по собственному опыту!) ..... но выброс будет в вин1251 .... да если стоит
$DOM->saveHTML(); то кодировка разрушенна а если ставить
$DOM->saveXML(); то все ок !!! за исключением того что это Иксмль ...
 

slach

Новичок
господин хороший
вы про xsl:eek:utput encoding="windows-1251"
слышали?
пробовали?
 

nimistar

Новичок
Автор оригинала: slach
господин хороший
вы про xsl:eek:utput encoding="windows-1251"
слышали?
пробовали?
гм а причем тут это ???
мне же надо в ХТМЛь !!!!! как раз ИксМЛь номано все .... но в том то и дело что он не подходит по ряду причин .....
не я понимаю - "в пременную и там срежь тег заголовка ..."

гм но ведь возможно же иначе !!!!!!!!!

чуствую что туплю на ровном месте ..... но где?

-~{}~ 08.06.06 21:01:

Вообщем справился!

Хочу поделится для бедолг который тоже пойдут по этому пути!

PHP:
$DOM = new DOMDocument();
$HTML=file_get_contents('tpl/main.tpl');
if(@$DOM->loadHTML(($HTML))){
	$NodeHead=$DOM->getElementsByTagName("head");
	$NodeMeta=$DOM->createElement('meta');
	$NodeMeta->setAttribute ("http-equiv","Character"); 
	$NodeMeta->setAttribute ("content","ISO-8859-1"); 
	$NodeHead->item(0)->insertBefore($NodeMeta,$NodeHead->item(0)->firstChild);
	$NodeMeta=$DOM->createElement('meta');
	$NodeMeta->setAttribute ("http-equiv","Content-Type"); 
	$NodeMeta->setAttribute ("content","text/html; charset=ISO-8859-1"); 
	$NodeHead->item(0)->insertBefore($NodeMeta,$NodeHead->item(0)->firstChild);
	
	$NodeByID="content";
	if(getElmentById($DOM,$NodeByID)){
		$NodeByID->nodeValue="";
		$Cont=CONTENT();
		$dom2= new DOMDocument();    ///'1.0','windows-1251'  ISO-8859-1  UTF-8
		$dom2->validateOnParse = true;
		$dom2->loadHTML($Cont);
		$NodeList=$dom2->getElementsByTagName("body");
		$NodeList=$NodeList->item(0)->childNodes;
		foreach($NodeList as $CHNode){
			$NND=$DOM->importNode($CHNode,TRUE);
			$NodeByID->appendChild($NND);
		}
		$DOM_out=$DOM->saveHTML();
		echo $DOM_out;
	}else{
		print "<b>Error HTML document! Not found node by ID='$NodeByID'</b>";
	}
}else{
	print "<b>Error open HTML document!</b>";
}
Это работающий код! :)

так в чем фишка ... :
PHP:
$DOM->encoding
- работает только если сохраняешь как
PHP:
$DOM->saveXML()
для
PHP:
$DOM->saveHTML()
- необходимо задавать верно МЕТА- тег ...
кстати незнаю в чем фишка но у меня неработало никак иначе нежели ISO-8859-1



PHP:
$DOM = new DOMDocument('1.0','windows-1251' );
- просто начхал на то что я указываю .... да ответ мне тоже вернули тока как 'windows-1251' - изменить я не мог ... что вообщем то не страшно так как к этому и стремился :rolleyes:

хотя меня это напрягает .... может кто ещё че нароет ???

это кстати каксается только если вы делаете
PHP:
$DOM->loadHTML(file_get_contents('tpl/main.tpl'))
- если писать все внутри ПХП то все конвертации работают отлично!
 

slach

Новичок
ох йо...
я отвечал Azy! а не вам =) простите сердешно =) ну раз справились то и хорошо
 
Сверху