Laden...

[erledigt] XML: XmlWriter für HTML-Files? (Valid-HTML!)

Erstellt von Levitas vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.978 Views
L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren
[erledigt] XML: XmlWriter für HTML-Files? (Valid-HTML!)

verwendetes Datenbanksystem: XML

Hallo Leute! Ich will eine HTML-Datei für spezielle Zwecke in meinem Programm generieren lassen. Das sollte aber ziemlich professionell sein, was man von einem HtmlTextWriter überhaupt nicht behaupten kann ... 😦
Deshalb wollte ich einen XmlWriter dazu "missbrauchen", habe jedoch kp, welche Lösung halbwegs akzeptabel ist, um mit einem XmlWriter ein Valid HTML - File mit Zeilenumbrüchen und Sonderzeichen in Attributen hinzubekommen.

Man könnte auf jeden Fall den ConformanceLevel auf Fragment stellen, aber das mit den NewLine-Characters...? 

 ist auf jeden Fall nicht html^^

Ich hoffe, ihr könnt mir helfen...

Danke im Vorraus,
Mfg Marc

70 Beiträge seit 2009
vor 14 Jahren

http://www.tsql.de/csharp/csharp_xml_erzeugen.htm könnte hilfreich sein. Damit kannst du exact deine HTML zusammenbauen, du solltest aber XHTML 1.0 als Doctype nutzen. mit html 4.01 wirst nur schlecht weiterkommen(aufgrund der implizieten schliessung vieler tags)

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren

Ok, das klingt schonmal gut 😃 Was mir nur auffiel... an XHTML dachte ich bisher nicht ... Geht das denn mit einem XmlWriter genau so? Da kenne ich mich besser aus, als bei den documents.. 😃

Danke auf jeden Fall!

Mfg Marc

70 Beiträge seit 2009
vor 14 Jahren

Der XMLWriter schreibt richtige xml dateien, ich würde die Methode von dem Link nutzen:

Damit müsste man recht einfach eine XHTML erstellen können, wie gesagt HTML warscheinlich weniger da tags so geschlosen werden:

<tag />

was HTML nicht unterstützt(meines Wissens). XHTML aber sehr wohl. Ich nehme an man kann nodes nur an ein document anhängen, nicht in den stream. Sieht aber recht einfach aus.

X
1.177 Beiträge seit 2006
vor 14 Jahren

huhu,

Doch, es war schon zu "nur HTML" so, dass die Elemete auch per abschließendem /> geschlossen werden konnten, genauso wie ein <html></html> natürlich geht. Z.B. <br /> war schon immer so definiert. Das ist ja auch nur eine erlaubte verkürzte Schreibweise. Eigentlich heisst es <br></br>.

HTML an sich war immer sehr dreckig, es wurden diese Dokument-Fehler einfach zugelassen. Allerdings haben sowohl XML als auch HTML die Sprache SGML als Grundlage und eindeutige DTDs zur Beschreibung. Diese erlaubt so etwas im Normalfall nicht. Um HTML wieder etwas näher an den Standard zu bringen wurde XHTML verfasst. XHTML wird strikter behandelt und erlaubt es Browsern explizit mit der Verarbeitung des Dokumentes aufzuhören, wenn dieses nicht valide ist. Da aber viele Homepage-Bastler eben nichts davon wissen/wussten, wird dieses strikte Verhalten nur im zusammenhang mit XML gesehen und viele Browser erlauben trotzdem dreckiges XHTML.

Um sauberes HTML/XHTML zu erstellen lohnt es sich die DTDs/Schemas welche definiert (http://www.w3.org/TR/html401/) sind zu verwenden. Dann ist dein HTML-Dokument auch immer valide.

Und noch etwas. Die Doctype-Deklaration in einer HTML Datei ist nicht nur zum Spaß da:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

Einfach mal dem Link http://www.w3.org/TR/html4/strict.dtd folgen. Da liegt die zugehörige DTD welche genau vorgibt, was erlaubt ist.

😃

Xyntaron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren

Danke mal für die vielen Antworten, habe mir jetzt schon ziemlich viel davon angesehen 😃

Aber, mein Problem ist bisher eig. nur gewesen, dass der XmlWriter was anderes für sonderzeichen verwendet, als die codes, die man in HTML verwendet... Ich bin mir nicht sicher, was der XmlWriter alles (für meine Zwecke gesehen) falsch macht, aber er schreibt z.B. für ein \r\n ein "&#xD;&#xA;"... und das geht in HTML nicht. Das wäre ja nicht mal so das problem, ich könnte die datei nachher einfach noch mal parsen und manipulieren, ich bin mir aber nicht sicher, ob der writer sonst alles so macht, wie es für HTML vorgesehen ist. Wenn es nur die Zeilenumbrüche sind, die er "falsch" macht, dann kann ich damit leben. Aber wenn es einige Sachen sind, die anders sind...? Weiß dazu vllt. jemand mehr?

Mfg Marc

479 Beiträge seit 2008
vor 14 Jahren

Hallo Marc,

versuchs doch mal mit selberschreiben. Hilfen wie Umlaute kannst du dir ja im PHP-Sourcecode raussuchen (die methode heißt imho htmletilities).

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren

Dafür habe ich derzeit keine Zeit... Ist eher dringend 😦

Lg Marc

70 Beiträge seit 2009
vor 14 Jahren

huhu,

Doch, es war schon zu "nur HTML" so, dass die Elemete auch per abschließendem /> geschlossen werden konnten, genauso wie ein <html></html> natürlich geht. Z.B. <br /> war schon immer so definiert. Das ist ja auch nur eine erlaubte verkürzte Schreibweise. Eigentlich heisst es <br></br>.

Das kann man so nicht ganz stehen lassen: Die verkürzte Schreibweise ist bei HTML 4 nur selten erlaubt. Bei divs sogar komplett invalide bzw. wird falsch ausgewertet(probiers mal aus, das Ergebnis ist sehr lustig.) bei XHTML 1.x ist sie deutlich öfter erlaubt. Zum Beispiel <br>: genau das ist eben nicht der Fall: http://www.w3.org/TR/html4/struct/text.html#edef-BR

Endtag: forbidden(!)

dasselbe Spielchen gilt für bsw. auch für <link> und viele andere. in XHTML ist es hingegen <br/>

hier die XHTML 1 Definition:

http://www.w3.org/TR/xhtml1/#h-4.6

zu den Sonderzeichen: just utf-8!

sofern(eigentlich immer) der Server utf-8 unterstützt brauchst du Sonderzeichen nicht mehr(sofern ich mich richtig entsinne). Musst du dann aber natürlich definieren

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Ich weis nicht ob ein <br> gegenüber einem <br> falsch interpretiert wird (vom Browser) ich meine aber das es nicht so war, es also dennoch funktioniert, wenn dein Kunde(hast du einen Kunden?) aber unbedingt will das du Valide arbeitest und das über eine anwendung generierst könntest du einfach nach dem schreiben die datei wieder einlesen und mit einer regex das / hinzufügen/entfernen brs kommen sowieso eher selten vor. Divs schliest man eigentlich auch nie impliziet(weshalb man es auch nicht darf(eine leere box..)) sonst fällt mir nicht ein wo Probleme auftauchen sollten, aber die lösung wäre eigentlich immer ein recht simples regex.

gruß

Alex

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren

Okay, ich kläre euch jetzt mal über das komplette Vorhaben auf (wäre vllt. besser gewesen, wen ich das schon früher gemacht hätte)

Das ganze ist für einen Kunden, es geht um ein Programm zur Verwaltung einer Foto-Galerie auf Basis von Slide.Show 2. Die eigentliche Homepage könnt ihr euch hier anschauen: http://www.wimex-san.at/

So, das klappt ja auch alles wunderbar, jedoch wollte der Kunde eine Möglichkeit, die Seite in reinem HTML darzustellen. Leider kommen in den Beschreibungen oft Zeilenumbrüche vor, könnt ihr euch ja angucken. Das ganze soll jetzt also 1:1 auf HTML übertragen werden, die alte Version von meinem Programm konnte das ja schon, jedoch seeeehr unsauber, und gar nicht schön. Vor allem bei Sonderzeichen, etc. Da kam immer irgendeine Krüppel-HTML raus (sry, aber es ist so^^)

Das hier ist die Nicht-Silverlight-Seite: http://www.wimex-san.at/Images/htmlslide.html ... So sollte das ganze aussehen, nur in der neuen Version von meinem Programm etwas schöner^^

Und da wären wir. Ich muss irgendwie eine sehr saubere HTML-Galerie rausbekommen, für Leute die kein Silverlight haben, bzw. keines installieren wollen. Dazu habe ich ja schon ein Konzept 😃

Ich hoffe, ihr versteht jetzt mein Problem, ich muss das mit den Zeilenumbrüchen einfach in den Griff bekommen, und das ganze soll als einfache Valid-Html rauskommen^^

Mfg Marc

PS:
Im Anhang ist ein Bild von meinem Programm 😃

70 Beiträge seit 2009
vor 14 Jahren

da ist das vorgehen ganz klar:

-Datei schreiben(vllt kann man sogar schon den stream regexen?) bin mit der ganze IO Geschichte in C# nur bedingt vetraut
-Datei auslesen
-regex pattern(schlicht "<br/>")
-und einfach austauschen regex.replace("<br>"); (oder so)
fertig.

versuch es einfach mal durch den Validator zu schicken.

wenn andere Fehler auftreten müsstest du sie ähnlich einfach beheben können.

gruß

Alex

Edit:

Wenn du den doctype auf xhtml 1.0 transitional stellst hast du nur 2 Fehlertypen:

atm inkorrekter doctype(xmlns fehlt)
und deine img brauchen immer ein alt tag. und wenn es nur alt="" ist. das muss noch dazu dann ist die Version vom Server schon valide. Und das einzige was zählt ist der grüne Balken ;D

3.971 Beiträge seit 2006
vor 14 Jahren

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Levitas,

[...]aber er schreibt z.B. für ein \r\n ein "&#xD;&#xA;"... und das geht in HTML nicht.

Dass das nicht geht, steht wo?
Hast du dir mal HttpUtility.HtmlEncode angeguckt?

Gruß,
dN!3L

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren

Hallo Leute!

Ich habe gerade die "perfekte" Lösung gefunden. Anfangs war mir das ganze mit dem HTML-Textwriter "etwas" zu kompliziert...

Naja, jetzt sieht das ganze etwas anders aus --> http://htmltextwriterutil.codeplex.com/

Ich werde das Tool hier jetzt einfach mal testen, ich denke aber, dass es hält, was es verspricht... 😃

Mfg Marc

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren

Hallo nochmal, und sry für den Doppelpost, aber ich habe jetzt die Lösung gefunden 😃


XmlWriter writer = XmlWriter.Create(Console.Out, new XmlWriterSettings { Indent = true });

            writer.WriteDocType("html", "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", null);
            writer.WriteStartElement("html", "http://www.w3.org/1999/xhtml");
            writer.WriteAttributeString("xml", "lang", "", "en");
            {
                writer.WriteStartElement("head");
                {
                    writer.WriteStartElement("title");
                    writer.WriteString("Das ist der Titel");
                    writer.WriteEndElement();
                    writer.WriteStartElement("style");
                    writer.WriteAttributeString("type", "text/css");
                    {
                        writer.WriteString("img { width: 150px; height: 150px; border: 1px; border-color: #000000; border-style: solid; }");
                    }
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
                writer.WriteStartElement("body");
                {

                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.Close();

Nunja, das klappt nun endlich so. Bei Writer.WriteString verwende ich einfach HttpUtility.HtmlEncode, und anschließend manipuliere ich nur mehr die \r\n's per Regex. Es klappt un alles, wie ich will, und W3 sagt, das alles passt 😃

Danke nochmal an alle,
Mfg Marc