Seite 1 von 1

PHP: DOMDocument::loadHTMLFile problem

Verfasst: 18.11.2008, 06:54
von nerd
hallo,

kennt sich jemand mit php dom (https://www.php.net/manual/en/book.dom.php) aus?
versuche hier ein .chm (windows helpfile) via php einzulesen und dann struktur in einer db speichern. das chm ist hier schon entpackt und besteht aus toc und den einzelnen seiten.
hier ist mein toc.hhc:

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<!-- Sitemap 1.0 -->
</HEAD><BODY>
<OBJECT type="text/site properties">
	<param name="ImageType" value="Folder">
</OBJECT>
<UL>
	<LI> <OBJECT type="text/sitemap">
		<param name="Name" value="Welcome">
		<param name="Local" value="cover.htm">
		</OBJECT>
	<LI> <OBJECT type="text/sitemap">
		<param name="Name" value="Introduction">
		<param name="Local" value="cover.htm">
		<param name="ImageNumber" value="1">
		</OBJECT>
	<UL>
		<LI> <OBJECT type="text/sitemap">
			<param name="Name" value="Installation">
			<param name="Local" value="installation.htm">
			</OBJECT>
		<LI> <OBJECT type="text/sitemap">
			<param name="Name" value="What's new">
			<param name="Local" value="whatsnew.htm">
			</OBJECT>
	</UL>
</UL>
</BODY></HTML>
hier der code um den toc einzulesen (bzw. mein versuch auf die ul's zuzugreifen):

Code: Alles auswählen

readreadHtmlToc&#40;"toc.hhc"&#41;;

function readHtmlToc&#40;$filename&#41;
&#123;
    $doc = new DOMDocument;
    @$doc->loadHTMLFile&#40;$filename&#41;;
    $tags = $doc->getElementsByTagName&#40;'ul'&#41;;
    foreach &#40;$tags as $tag&#41; &#123;
           echo $tag->nodeValue."\n";
    &#125;        
    //echo $doc->saveHTML&#40;&#41;;
&#125;
bekomme hierbei nur fehlermeldungen "Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: ID Name already defined in ../import/toc.hhc, line: 16 in C:\xampp\htdocs\qb_help\includes\class_import.php on line 56" (ID? in dem toc sind keine id's vergeben!)

wenn ich testweise den <object><param> salat mit links wie <a href="abc.html">abc</a> ersetze klappt es und ich kann die datei in DOM einlesen und durchlaufen.
ich habe versucht mit preg_replace was zu basteln was alle <objects> nach <a> mit den entsprechenden parametern zu ersetzt - habe allerdings wenig ahnung von regex. mein problem war der whitepace (linebraeck und unbekannt anzahl tabs nach <OBJECT type="text/sitemap">) sowie die optionale zeile <param name="ImageNumber" value="1">.
kann mir jemand erklaeren wie man das macht; oder gibts noch ne einfache/bessere loesunbg fuer das problem? am ende der funktion sollte ich die struktur irgendwie in einem verschachtelten array haben, sodas ich fuer jede node name, link und ID der parentnode habe...

Verfasst:
von

Verfasst: 18.11.2008, 13:11
von maddoggy
Eine Lösung kann ich dir jetzt zwar nicht direkt anbieten aber ich vermute das es an der html version liegt.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> ist doch html 1.x wenn ich mich nicht täusche. Wenn ich mich irre dann verbessert mich.
HTML 1.x ist so alt das kennt noch nicht mal mehr nen validator. Da könnte ich mir gut vorstellen das die PHP Bilbliotheken das auch nicht mehr fressen, auch wenn sie keinen sauberen HTML Code wollen.

Vielleicht wäre des richtige Ansatz das file erstmal in brauchbares HTML zu wandeln.... keine Ahnung vielleicht gibt es da Tools für...zb. Frontpage müsste das ja können.
Vielleicht könntest du damit dann weiter arbeiten.

Ich hoffe ich konnte irgendwie weiterhelfen

Grüße

Alex