Beim Generieren von XML aus XmlDocument in .NET xmlns
wird beim ersten Einfügen eines Elements ohne zugeordneten Namespace ein leeres Attribut angezeigt . Wie kann dies verhindert werden?
Beispiel:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
"whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);
Ausgabe:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
Gewünschte Ausgabe:
<root xmlns="whatever:name-space-1.0"><loner /></root>
Gibt es eine Lösung für den XmlDocument
Code, die nicht nach dem Konvertieren des Dokuments in eine Zeichenfolge mit auftritt OuterXml
?
Mein Grund dafür ist, zu prüfen, ob ich mit XmlDocument-generiertem XML mit dem Standard-XML eines bestimmten Protokolls übereinstimmen kann. Das leere xmlns
Attribut darf einen Parser nicht beschädigen oder verwirren, aber es ist auch in keiner Verwendung vorhanden, die ich von diesem Protokoll gesehen habe.
quelle
doc.DocumentElement.NamespaceURI
), geben jedoch keinen Namespace an, für denCreateAttribute()
Sie den Namen erhalten,xmlns:psomething
auch wenn es sich um denselben Uri handelt.Dies ist eine Variante der Antwort von JeniT (Vielen Dank übrigens!)
Dadurch muss der Namespace nicht mehr überall kopiert oder wiederholt werden.
quelle
Wenn das
<loner>
Element in Ihrem Beispiel-XML nicht diexmlns
Standard-Namespace-Deklaration enthält, befindet es sich imwhatever:name-space-1.0
Namespace und nicht in keinem Namespace. Wenn Sie dies möchten, müssen Sie das Element in diesem Namespace erstellen:Wenn Sie möchten, dass sich das
<loner>
Element in keinem Namespace befindet, ist das erstellte XML genau das, was Sie benötigen, und Sie sollten sich keine Gedanken über dasxmlns
Attribut machen, das automatisch für Sie hinzugefügt wurde.quelle
Da sich root in einem nicht vordefinierten Namespace befindet, muss jedes untergeordnete Element von root, das keinen Namespace haben möchte, wie in Ihrem Beispiel ausgegeben werden. Die Lösung wäre, dem Stammelement wie folgt vorangestellt zu werden:
Code:
quelle
Wenn möglich, erstellen Sie eine Serialisierungsklasse und gehen Sie dann wie folgt vor:
Es ist sicherer und Sie können die Namespaces mit Attributen steuern, wenn Sie wirklich mehr Kontrolle benötigen.
quelle
Ich habe das Problem mithilfe des Factory-Musters gelöst. Ich habe eine Factory für XElement-Objekte erstellt. Als Parameter für die Instanziierung der Factory habe ich ein XNamespace-Objekt angegeben. Jedes Mal, wenn ein XElement von der Factory erstellt wird, wird der Namespace automatisch hinzugefügt. Hier ist der Code der Fabrik:
quelle
XmlDocument
nicht danachXDocument
.Ja, Sie können das XMLNS vom XmlElement aus verhindern. Erst Zeit schaffen, es kommt: so
Ändern Sie den Code: Und übergeben Sie den XML-Namespace wie folgt
C # -Code:
quelle