2013-02-12 15 views
9

Ich habe versucht:Wie spezifiziert man ein xmlns für XDocument?

textBox1.Text = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), 
    new XElement("root1", new XAttribute("xmlns", @"http://example.com"), new XElement("a", "b")) 
).ToString(); 

Aber ich bekomme:

The prefix '' cannot be redefined from '' to 'http://example.com' within the same start element tag. 

Ich versuchte Substitution auch (nach einer Antwort gefunden I):

XAttribute(XNamespace.Xmlns,... 

bekam aber auch einen Fehler.

Hinweis: Ich versuche nicht, mehr als ein xmlns im Dokument zu haben.

+2

Vielleicht funktioniert das für Sie: http://Stackoverflow.com/a/2874572/1373170 –

Antwort

20

Die Art und Weise, wie die XDocument API mit Namespace-Namen arbeitet, ist . Es ist ziemlich einfach mit ihnen zu arbeiten, solange Sie akzeptieren, dass ein XML-Name nicht nur eine Zeichenkette, sondern eine Bereichskennung ist. Hier ist, wie ich es tun:

var ns = XNamespace.Get("http://example.com"); 
var doc = new XDocument(new XDeclaration("1.0", "utf-8", null)); 
var root = new XElement(ns + "root1", new XElement(ns + "a", "b")); 
doc.Add(root); 

Ergebnis:

<root1 xmlns="http://example.com"> 
    <a>b</a> 
</root1> 

Notiere die + Betreiber überlastet ist ein XNamespace und ein String zu akzeptieren und XName Instanz zu führen.

+1

Vielen Dank. Es ist merkwürdig, dass es keinen _simple_ Weg gibt, einen Namespace nur einmal hinzuzufügen. – ispiro

+1

Nun, ich denke, das ist ziemlich einfach, und es macht wirklich nach Hause, dass Sie Namespaced Namen, nicht nur Strings erstellen. Wenn Sie weniger Code für Namespaces benötigen, verwendet die 'System.Xml.XmlDocument'-Klasse einen Namespace-Manager, um den Root-Namespace zu verfolgen, und Sie können so tun, als ob er nicht existiert, sobald Sie das Setup richtig eingerichtet haben. – codekaizen

+0

Siehe meine nächste Frage: http://stackoverflow.com/questions/14841517/how-can-i-add-innerxml-without-it-being-modified-in-anyyway- Ich versuche 'XmlDocument' als gut und es hilft nicht. – ispiro