2009-08-20 8 views
0

Meine Frage ist, wie Werte auf zwei Attribute festgelegt werden, die denselben Namen, aber unterschiedliche Namespaces haben.explizite und implizite XML-Namensräume

Mit C#, in einem XML-Dokument, muss ich einem Element zwei Attribute zuweisen. Es sollte aussehen wie

doc xmlns: XMI = "uriaddress" Element xsi: type = "xsitype1" type = "Typ1"

I

xElement.SetAttribute ("type" versucht, "uriaddress", "xsitype1")

das funktioniert gut!

aber meine Überraschung ist, dass, wenn ich versuchte, das zweite Attribut "type" zu setzen, durch

xElement.SetAttribute ("Typen", "Typ1")

dies funktioniert, aber es ist auch setzt das Attribut xmi: type auf denselben Wert wie das Attribut "type" zurück und ändert das Element auf eine nicht beabsichtigte Weise.

Jetzt sieht das Element wie

Element xsi: type = "Typ1" type = "Typ1"

Jede Art und Weise, dies zu umgehen?

Antwort

0

Scheint mir, als ob Sie den falschen Namespace in den ersten SetAttribute-Aufruf eingeben. Das Namespace sollte der Namespace für das xsi sein, nicht für die XMI-Präfix ...

Sie nur versuchen können, das Problem zu demonstrieren, so dass ich vielleicht die falsche Idee hier

Hoffnung, die

hilft bekommen haben
+0

Danke für den Versuch zu beantworten. Du hast geschrieben, dass nur meine Illustration ein Problem hatte. Der Namensraum im Dokument ist wirklich xmlns: xsi = "uriaddress" So leider bleibt die Frage noch. –

2

Dieser Code:

XDocument d = new XDocument(); 
    XNamespace xsi = "uriaddress"; 
    d.Add(
     new XElement(
      "element", 
      new XAttribute(XNamespace.Xmlns + "xsi", "uriaddress"), 
      new XAttribute("type", "foo"), 
      new XAttribute(xsi + "type", "bar"))); 
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

    d.Element("element").SetAttributeValue("type", "baz"); 
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

    d.Element("element").SetAttributeValue(xsi + "type", "bar");   
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

erzeugt diese Ausgabe (Leerzeichen hinzugefügt und XML-Deklarationen zur besseren Lesbarkeit entfernt):

<element xmlns:xsi="uriaddress" type="foo" xsi:type="bar" /> 

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bar" /> 

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bat" /> 

Wenn Sie nicht XDocument mit (schwer von Ihrer ursprünglichen Post sagen), erzeugt dieser Code im Wesentlichen das gleiche Ergebnis:

XmlDocument d = new XmlDocument(); 
    d.LoadXml("<element xmlns:xsi='uriaddress' type='foo' xsi:type='bar'/>"); 
    Console.WriteLine(d.OuterXml); 

    d.DocumentElement.SetAttribute("type", "baz"); 
    Console.WriteLine(d.OuterXml); 

    d.DocumentElement.SetAttribute("type", "uriaddress", "bat"); 
    Console.WriteLine(d.OuterXml); 
+0

Robert, Vielen Dank für Ihre Hilfe. Ich habe es etwas anders und es hat gut funktioniert. Anstatt SetAttribute direkt zu verwenden, habe ich zuerst das Attribut als separates Objekt erstellt und dann an die Liste der Attribute angehängt. Ich habe die Idee von dem Code bekommen, den du gepostet hast, wofür ich dir nochmals danke. Mike –

Verwandte Themen