Wie erstellen Sie XElement mit dem Standard-namespace für Kinder ohne Verwendung XNamespace in allen untergeordneten Knoten
Ich versuche zu verwenden System.Xml.Linq
zum erstellen von XHTML-Dokumenten. So, die überwiegende Mehrheit der Knoten in meine Bäume sollten diesen namespace verwenden:
http://www.w3.org/1999/xhtml
Kann ich XElement
Knoten bezieht sich auf diesen namespace einfach genug, mit einem XNamespace
wie diese:
XNamespace xhtml = "http://www.w3.org/1999/xhtml";
//...
new XElement(xhtml + "html", //...
Aber ich will nicht zu haben, um eine XNamespace
verfügbar in all der code, der erzeugt HTML-Knoten, und haben das Präfix jedes einzelne XElement
(und XAttribute
) name erstelle ich entsprechend.
Den XML-text-format selbst nimmt diese Anforderung zu berücksichtigen, und erlaubt die Einstellung einer Standard-namespace in einem Vorfahren, die Nachkommen vererbt, mit dem reservierten xmlns
Attribut. Ich würde gerne etwas ähnliches machen mit System.Xml.Linq
.
Ist das möglich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich beschlossen, die Verwendung einer statischen Klasse namens
XHtml
, dass wie folgt aussieht:Scheint dies die sauberste Art und Weise, Dinge zu tun, vor allem, wie kann ich dann hinzufügen, Komfort-Routinen, wie die
XHtml.A
Methode (nicht alle meiner Klasse wird hier gezeigt).Nahm ich das rekursiv umschreiben Pfad. Sie haben nicht wirklich zu 'rekonstruieren' der Baum. Sie können einfach die swap-Knoten-Namen (
XName
).Das problem ist das die XName verwendet, um das XElement benötigt, geben Sie den richtigen namespace. Was wäre ich versucht zu tun ist erstellen Sie eine statische Klasse wie folgt aus:-
Nun können Sie bauen eine xhtml doc so:-
Einen alternativen Ansatz, um das statische Klasse wäre:-
Dieser den Nachteil hat, instancing alle möglichen XName, unabhängig davon, ob Sie Sie verwenden, aber der Vorteil ist die Umwandlung der Namespace + "tagname" passiert nur einmal. Ich bin mir nicht sicher, dass diese Konvertierung optimiert werden aus sonst. Ich bin sicher, dass XNames werden nur einmal instanziert:-