2010-02-05 6 views
5

Ho un XElement che devo creare tramite espressioni letterali dinamiche xml/espressioni incorporate e Ho bisogno di ereditare lo spazio dei nomi predefinito. Questo non sembra possibile attraverso tutto ciò che ho provato. Qualcuno sa come farlo funzionare?Perché non XML letterali dinamici ereditano lo spazio dei nomi predefinito

Ad esempio

Imports <xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
Sub CreateXAML() 
     Dim obj = "Rectangle" 
     Dim objFill As String = obj & ".Fill" 
     Dim myXML As XElement = <<%= obj %>><<%= objFill %>>no namespace</></> 

     Dim myXML2 As XElement = <Path><Path.Fill>inherits namespace</Path.Fill></Path> 
     MsgBox(myXML.ToString & vbCrLf & myXML2.ToString) 
End Sub 

Il primo, myXML, non viene creato con i ns predefiniti, ma il secondo, myXML2, è.

+2

Ho cercato un modo per ottenere un XElement senza il valore predefinito, quindi la tua domanda risponde come farlo! – CoderDennis

+2

Interessante che 'Dim myXML As XElement = <<%= obj %>> nessuno spazio dei nomi' non funziona nemmeno, ma produce un'eccezione di runtime. Ho sempre pensato che il modo in cui i letterali xml inserivano il namespace fosse strano. Non ho ancora capito come controllarlo. – CoderDennis

+0

Sì, un tempo stavo anche cercando un modo per crearlo senza lo spazio dei nomi predefinito, quindi in realtà è una buona tecnica. Mi piacerebbe essere in grado di contrassegnarlo come "ha bisogno di default ns" o qualcosa del genere. –

risposta

3

Questo è documentato http://msdn.microsoft.com/en-us/library/bb675177.aspx nella sezione Global Namespaces e Embedded Expressions che non funzionerà, ma l'articolo non fornisce soluzioni o soluzioni. Ho avuto questo bisogno prima di troppo e solo attraverso tentativi ed errori, è stato in grado di farlo per sviluppare l'elemento in anticipo con lo spazio dei nomi al seguito, in questo modo:

Imports <xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
Sub CreateXAML() 
    Dim shape = "Rectangle" 
    Dim obj = <<%= "{http://schemas.microsoft.com/winfx/2006/xaml/presentation}" & shape %>></> 
    Dim objFill = <<%= "{http://schemas.microsoft.com/winfx/2006/xaml/presentation}" & shape %>></> 
    Dim myXML As XElement = <<%= obj %>><<%= objFill %>>has namespace</></> 

    Dim myXML2 As XElement = <Rectangle><Rectangle.Fill>inherits namespace</Rectangle.Fill></Rectangle> 
    MsgBox(myXML.ToString & vbCrLf & myXML2.ToString) 
End Sub 

si potrebbe chiedere perché le "importazioni" la dichiarazione è ancora lì. Bene, è usato nel caso di aggiungere in un XElement non dinamico per ereditare lo spazio dei nomi globale. In questo modo:

<<%= obj %>><<%= objFill %>><Text>has namespace</Text></></> 
+1

Questo è geniale. Non ero stato in grado di trovare un modo per ottenere gli xmlns lì senza un errore di run time, come * Dim obj = <<%= shape %> xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"> *. Grande, bello, fantastico! –

+0

Non riesco a capire quanto è bello. Ha tagliato il mio codice del 50%! –

Problemi correlati