none
XML Literale und Namespace RRS feed

  • Frage

  • Hallo

    Ich habe einige Probleme mit der Verwendung von Namespaces in Literalen

    Folgender Code:

    Imports <xmlns="http://www.w3.org/2000/svg">
    Dim a = <test1></test1>
            Dim b = <svg><%= a %></svg>
            b.Add(<test2></test2>)
            b.Add(<test3></test3>)

    liefert dieses Ergebnis:

    <svg xmlns="http://www.w3.org/2000/svg">
      <test1></test1>
      <test2 xmlns="http://www.w3.org/2000/svg"></test2>
      <test3 xmlns="http://www.w3.org/2000/svg"></test3>
    </svg>

    Das Ergebnis ist zwar richtig, ich hätte aber gerne, dass test2 und test3 ohne Namespace ausgegeben werden. Anscheinend geht dies nur, wenn ich die Childs direkt im Literal angebe. Ein späteres Hinzufügen über XElement.Add erkennt den Default-Namespace nicht.

    Wie kann ich das umgehen ohne auf die Schreibweise XElement(GetXmlNamespace() + "test3") umsteigen zu müssen?

    Vielen Dank

    Armin Müller

    Donnerstag, 3. Juni 2010 09:45

Antworten

Alle Antworten

  • Hallo Armin,

    wenn Du dem Namespace einen Namen gibts (wie unten mit mySpace), wird es in den Literalen weg gelassen, allerdings auch beim Root Element. Dort könntest Du es bei Bedarf noch mal explict hin schreiben.

    Imports <xmlns:mySpace="http://www.w3.org/2000/svg">

     

    Module Module1

     

        Public Sub main()

     

     

            Dim a = <test1></test1>

            Dim b = <svg xmlns="http://www.w3.org/2000/svg"><%= a %></svg>

     

            b.Add(<test2></test2>)

            b.Add(<test3></test3>)

     

            Console.WriteLine(b.ToString)

            Console.ReadKey()

     

        End Sub

     

    End Module

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 3. Juni 2010 10:23
  • Hallo Olaf,

    danke für den Vorschlag. Aber der Namespace wird leider dabei nicht weggelassen sondern auf leer gesetzt

    <svg xmlns="http://www.w3.org/2000/svg">
      <test1 xmlns=""></test1>
      <test2 xmlns=""></test2>
      <test3 xmlns=""></test3>
    </svg>

    Donnerstag, 3. Juni 2010 11:39
  • Ich sage es mir immer wieder, nach Test und vor "Release" nichts mehr ändern ;-).

    Im RootNode auch einen Namen ansgeben:
    Dim b = <svg xmlns:mySpace="http://www.w3.org/2000/svg"><%= a %></svg>


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 3. Juni 2010 12:05
  • Hallo Olaf,

     

    das ist es auch noch nicht. Jetzt bekomme ich

    <svg xmlns:mySpace ="http://www.w3.org/2000/svg">
      <test1></test1>
      <test2></test2>
      <test3></test3>
    </svg>

    Es sollte aber

    <svg xmlns ="http://www.w3.org/2000/svg">
      <test1></test1>
      <test2></test2>
      <test3></test3>
    </svg>

    heißen. Irgendwie funktioniert das ganze mit dem Default-Namspace nicht.

    Vielleicht noch ne Idee?

    Armin

     

    Donnerstag, 3. Juni 2010 15:22
  • Hallo Armin,

    schau Dir mal folgenden Blog-Beitrag an, da geht es um das gleiche Thema und ein Workaround:

    Cleaning up your XML literal namespaces
    http://msmvps.com/blogs/bill/archive/2007/11/24/cleaning-up-your-xml-literal-namespaces.aspx


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert ArminMueller Freitag, 4. Juni 2010 08:04
    Donnerstag, 3. Juni 2010 16:10
    Moderator
  • Hallo Armin,

    das Problem ist zum Teil wie die Erweiterung von Visual Basic arbeitet.

    Bei <svg><%= a %></svg> wird eine Ersetzung über interne Hilfsmethoden
    vorgenommen, bei den Add-Methoden nicht.

    Imports <xmlns="http://www.w3.org/2000/svg">
    
        Dim a = <test1></test1>
    
        Dim b = <svg><%= a %></svg>
    
        Dim c = <test2></test2>
        b.Add(c)
    
        Dim d = <test3></test3>
        b.Add(d)
    
        Console.WriteLine("Nodes: " + b.ToString())
    
        ' Variante 2:
        Dim b2 = <svg><%= a %><%= c %><%= d %></svg>
        Console.WriteLine("Document: " + b2.ToString())
    
    "b2" würde das gewünschte Ergebnis liefern, setzt aber voraus,
    das durchgängig die Erweiterungen von VB genutzt wird.

    Willst Du Dich nicht einschränken lassen,
    ersetze wie im  Link von Thorstens Beitrag.
    Oder verzichte auf die Syntax-Erweiterungen.

     

    Gruß Elmar
    Donnerstag, 3. Juni 2010 18:05
    Beantworter
  • Hallo Thorsten, Hallo Elmar,

    vielen Dank für die Infos,mit dem Workaround hats funktioniert.

    Es ist schade, dass sich die XML-Literale und die klassischen Funktionen der X-Objekte nicht so einfach mischen lassen. Manchmal sieht die Literal-Schreibweise einfach lesbarer aus

    Gruß

    Armin

    Freitag, 4. Juni 2010 08:08