2015-09-01 3 views
0

Как получить имя элемента переменной при использовании XML-литералов? Это нормально, когда я не пытаюсь использовать пространство имен, но когда я это делаю, он терпит неудачу.VB.NET XML Literal Variable Element Name с пространством имен

Это прекрасно работает:

Dim elementName As String = "tc" 
Dim tc As XElement = <<%= elementName %>/> 

и возвращается:

<tc /> 

Но если я пытаюсь добавить 'ш:' пространства имен, то это не:

Dim tc As XElement = <w:<%= elementName %>/> 

Или это:

Dim tc As XElement = <<%= "w:" & elementName %>/> 

Так может кто-нибудь сказать мне, как добраться до:

<w:tc /> 

переменно, используя XML-литералов?

UPDATE:

Спасибо Мартину за ваш ответ, это было как раз то, что я искал. Чтобы уточнить, в корневом документе, над которым я работал, уже было пространство имен, в котором я нуждался, я просто добавляю/редактирую существующий документ (документ wordprocessingml).

Я думаю, это самый простой и элегантный способ решения этой проблемы:

Dim tc as XElement = <<%= Me.Root.GetNamespaceOfPrefix("w") + elementName %>/> 

Где Me это класс, который наследует XDocument.

+0

Хотя принято, это не так, как ожидается, XML, которые будут рассматриваться в .NET (= вы не максимизируя огромные ОО-возможности). Вы должны лучше полагаться на соответствующие классы/свойства. Например: Dim tc As XElement = Новый XElement (elementName); или используйте класс XNamespace для пространств имен. – varocarbas

+0

Хорошо, тогда в чем смысл синтаксиса XML-литерала, если я даже не могу добавить пространство имен? –

+0

вам нужно добавить uri, а не код пространства имен, то есть «uri: my-uri» & elementName – tolanj

ответ

1

Вы можете использовать выражение, которое создает XName (делает XNamespace + "localName"), например.

Dim ns1 As XNamespace = "http://example.com/ns1" 
    Dim ns2 As XNamespace = "http://example.com/ns2" 
    Dim localName1 As String = "foo" 
    Dim localName2 As String = "bar" 
    Dim root As XElement = 
    <root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2"> 
     <<%= ns1 + localName1 %>>test</> 
     <<%= ns2 + localName1 %>>test 2</> 
     <<%= ns1 + localName2 %>>test</> 
     <<%= ns2 + localName2 %>>test 2</> 
    </root> 
    Console.WriteLine(root) 

Результат

<root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2"> 
    <ns1:foo>test</ns1:foo> 
    <ns2:foo>test 2</ns2:foo> 
    <ns1:bar>test</ns1:bar> 
    <ns2:bar>test 2</ns2:bar> 
</root> 
+0

Thankyou martin, я пошел немного проще, поскольку я уже добавлял xml в документ с указанными пространствами имен, поэтому я использовал Me.Root.GetNamespaceOfPrefix («w») + localName1, например. Я уточню свой ответ. –

Смежные вопросы