Почему динамические литералы XML не наследуют пространство имен по умолчанию - PullRequest
5 голосов
/ 05 февраля 2010

У меня есть XElement, который мне нужно создать с помощью динамических литералов xml / встроенных выражений и Мне нужен он для наследования пространства имен по умолчанию.Это кажется невозможным из-за всего, что я пробовал.Кто-нибудь знает, как заставить это работать?

Например

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

Первый, myXML, создан не с ns по умолчанию, а второй, myXML2, есть.

1 Ответ

3 голосов
/ 07 февраля 2010

Это задокументировано http://msdn.microsoft.com/en-us/library/bb675177.aspx в разделе «Глобальные пространства имен и встроенные выражения», что оно не будет работать, но статья не предлагает обходного пути или решения. У меня была эта потребность и раньше, и только методом проб и ошибок я смог заставить его работать, заранее создав элемент с помощью пространства имен на буксире, например:

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

Вы можете задаться вопросом, почему утверждение "Imports" все еще там. Ну, он используется в случае добавления нединамического XElement для наследования глобального пространства имен. Как это:

<<%= obj %>><<%= objFill %>><Text>has namespace</Text></></>
...