Frage

Wenn XML von XmlDocument in .NET Erzeugen ein leeres xmlns Attribut wird das erste Mal, wenn ein Element ohne ein zugehörigen Namensraum eingeführt wird; 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ünschter Ausgang:

<root xmlns="whatever:name-space-1.0"><loner /></root>

Gibt es eine Lösung für den XmlDocument Code, nicht etwas, das tritt nach Umwandeln des Dokument in eine Zeichenfolge mit OuterXml?

Meine Argumentation, dies zu tun ist, um zu sehen, ob ich den Standard-XML eines bestimmten Protokolls entsprechen kann mit XmlDocument-generierte XML. Der Rohling xmlns Attribut kann nicht brechen oder einen Parser verwirren, aber es ist auch nicht in jeder Nutzung, die ich dieses Protokolls gesehen habe.

War es hilfreich?

Lösung

Dank Jeremy Lew Antwort und ein bisschen mehr herumspielen, habe ich herausgefunden, wie leer xmlns entfernen Attribute: pass im Namespace Root-Knoten, wenn alle untergeordneten Knoten Erstellen Sie nicht ein Präfix haben auf. einen Namensraum ohne Präfix an der Wurzel unter Verwendung bedeutet, dass Sie den gleichen Namensraum auf untergeordnete Elementen für sie auch keine Präfixe hat.

verwenden müssen

Fixed Code:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0")); 
Console.WriteLine(xml.OuterXml);

Danke an alle, um alle Ihre Antworten, die mich in der richtigen Richtung geführt!

Andere Tipps

Dies ist eine Variante von JeniT Antwort (Danke sehr, sehr viel btw!)

XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);

Dies eliminiert den Namespace überall kopieren oder wiederholen zu müssen.

Wenn das <loner> Element in Ihrem XML-Beispiel nicht die xmlns Standardnamespace-Deklaration auf sie hat, dann wäre es eher im whatever:name-space-1.0 Namespace als in keinem Namensraum zu sein. Wenn das, was Sie wollen, müssen Sie das Element in diesem Namensraum erstellen:

xml.CreateElement("loner", "whatever:name-space-1.0")

Wenn Sie das <loner> Element wollen in keinem Namensraum sein, dann ist die XML, die produziert worden ist genau das, was Sie brauchen, und Sie sollten nicht über das xmlns Attribut Sorge, die automatisch hinzugefügt wurde.

Da Wurzel in einem ohne Präfix-Namespace ist, dass jedes Kind von Wurzel will un-Namensraum sein muss Ausgabe wie Ihr Beispiel sein. Die Lösung wäre das Wurzelelement Präfix wie folgt:

<w:root xmlns:w="whatever:name-space-1.0">
   <loner/>
</w:root>

code:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement( "w", "root", "whatever:name-space-1.0" );
doc.AppendChild( root );
root.AppendChild( doc.CreateElement( "loner" ) );
Console.WriteLine(doc.OuterXml);

Wenn möglich, erstellen Sie eine Serialisierung Klasse dann tun:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(yourType);
serializer.Serialize(xmlTextWriter, someObject, ns);

Es ist sicherer, und Sie können die Namensräume mit Attributen steuern, wenn Sie wirklich mehr Kontrolle benötigen.

Ich habe das Problem, indem sie mit dem Fabrik-Muster gelöst. Ich habe eine Fabrik für XElement-Objekte. Als Parameter für die Instanziierung der Fabrik habe ich ein XNamespace Objekt angegeben. Also, jedes Mal wenn ein XElement wird von der Fabrik erstellt der Namespace wird automatisch eingefügt. Hier ist der Code der Fabrik:

internal class XElementFactory
{
    private readonly XNamespace currentNs;

    public XElementFactory(XNamespace ns)
    {
        this.currentNs = ns;
    }

    internal XElement CreateXElement(String name, params object[] content)
    {
        return new XElement(currentNs + name, content);
    }
}

Ja, um die XMLNS vom XmlElement verhindern kann. Zuerst erstellen Zeit es kommt: wie das

<trkpt lat="30.53597" lon="-97.753324" xmlns="">
    <ele>249.118774</ele>
    <time>2006-05-05T14:34:44Z</time>
</trkpt>

Ändern Sie den Code: Und XML-Namespace übergeben wie diese

C # -Code:

XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1");
bookElement.SetAttribute("lat", "30.53597");
bookElement.SetAttribute("lon", "97.753324");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top