Ich versuche, System.Xml.Linq
zu verwenden, um XHTML-Dokumente zu erstellen. Daher sollte die überwiegende Mehrheit der Knoten in meinen Bäumen diesen Namensraum verwenden:
Ich kann XElement
Nodes, die auf diesen Namespace beschränkt sind, leicht genug erstellen, indem ich ein XNamespace
verwende, wie folgt:
Ich möchte jedoch nicht XNamespace
für den gesamten Code, der HTML-Knoten erstellt, verfügbar machen und jedem einzelnen XElement
(und XAttribute
) Namen, den ich erstelle, einen Präfix geben.
Das XML-Textformat selbst berücksichtigt diese Anforderung und ermöglicht das Festlegen eines Standardnamespace in einem Vorgänger, der von Nachkommen geerbt wird. Dabei wird das reservierte xmlns
-Attribut verwendet. Ich möchte etwas ähnliches mit System.Xml.Linq
machen.
Ist das möglich?
Ich habe mich entschieden, eine statische Klasse namens XHtml
zu verwenden, die wie folgt aussieht:
Dies scheint die sauberste Art zu sein, Dinge zu tun, besonders, da ich dann Komfortroutinen hinzufügen kann, wie die XHtml.A
-Methode (nicht meine ganze Klasse wird hier gezeigt).
Ich habe den rekursiv umschreibenden Pfad genommen. Sie müssen den Baum nicht wirklich "rekonstruieren". Sie können die Knotennamen einfach austauschen ( XName
).
Das Problem ist, dass der XName, der zum Erstellen des XElement verwendet wird, den richtigen Namespace angeben muss. Was ich versucht wäre, wäre eine statische Klasse wie folgt zu erstellen: -
%Vor%Nun können Sie ein xhtml doc wie folgt erstellen: -
%Vor%Ein alternativer Ansatz für diese statische Klasse wäre: -
%Vor%Dies hat den Nachteil, dass alle möglichen X-Namen instanziiert werden, unabhängig davon, ob Sie sie verwenden, aber das Umgekehrte ist die Umwandlung von Namespace + "tagname" passiert nur einmal. Ich bin mir nicht sicher, ob diese Konvertierung sonst optimiert würde. Ich bin mir sicher, dass XNames nur einmal instanziert werden: -
%Vor%Tags und Links .net c# namespaces xml linq-to-xml