2010-02-05 11 views
5

Tengo un XElement que necesito crear a través de xml XMLs/expresiones integradas y Lo necesito para heredar el espacio de nombres predeterminado. Esto no parece posible a pesar de todo lo que he intentado. ¿Alguien sabe cómo hacer que esto funcione?¿Por qué no XML Literals dinámicos heredan el espacio de nombre predeterminado

Por ejemplo

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 

El primero, myXML, no se crea con los ns predeterminados, pero la segunda, myXML2, es.

+2

He estado buscando una forma de obtener un XElement sin las ns predeterminadas, por lo que su pregunta responde cómo hacerlo. – CoderDennis

+2

Interesante que 'Dim myXML As XElement = <<%= obj %>> sin espacio de nombres' ni siquiera funciona, pero produce una excepción de tiempo de ejecución. Siempre he pensado que la forma en que los literales xml insertan el espacio de nombres era extraño. Todavía no he descubierto cómo controlarlo. – CoderDennis

+0

Sí, en algún momento también estaba buscando una forma de crearlo sin el espacio de nombres predeterminado, por lo que en realidad es una buena técnica. Me gustaría poder marcarlo como "no necesita ns por defecto" o algo así. –

Respuesta

3

Esto está documentado http://msdn.microsoft.com/en-us/library/bb675177.aspx en la sección Espacios de nombres globales y expresiones incrustadas que no funcionará, pero el artículo no proporciona una solución alternativa. Tenía esta necesidad dentro de poco y sólo a través de ensayo y error, era capaz de conseguir que funcione mediante la creación del elemento de antemano con el espacio de nombres en el remolque, así:

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 

Usted puede preguntarse por qué las "importaciones" declaración todavía está allí. Bueno, se usa en el caso de agregar un XElement no dinámico para heredar el espacio de nombres global. De esta manera:

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

Esto es brillante. No he podido encontrar la forma de obtener las xmlns sin un error de tiempo de ejecución, como * Dim obj = <<%= shape %> xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"> *. ¡Genial, genial, genial! –

+0

No puedo olvidar lo bueno que es esto. ¡Ha cortado mi código en un 50%! –

Cuestiones relacionadas