2008-09-09 13 views
3

Ich bin ein C# -Entwickler, der im ersten VB-Code, den er seit VB6 geschrieben hat, herumfummelt. Wenn ich also eine ziemlich offensichtliche Frage stelle, bitte verzeih mir.Verwenden von Zeichenfolgen in XML-Literalen

entschied ich mich mit XML-Literale zu experimentieren für mich einige XML-Code zu generieren, statt

XMLDocument mit

Ich habe 2 Fragen, die erste, um herauszufinden, die zweite in Bezug auf dieses Problem zu umgehen aufgrund meiner Unfähigkeit.

1: Ideale Lösung

Ich habe ein Wörterbuch der Elementname, ElementValue dessen KeyValue Paare Ich war Schleifen über in der Hoffnung, dynamisch die Werte zu generieren, aber die folgende Syntax stirbt einen schrecklichen Tod

Dim xConnections As XElement   
For Each connection As Connection In connections.AsList 
    For Each kvp As KeyValuePair(Of String, String) In connection.DecompiledElements 
     xConnections = <Connections> <<%= kvp.Key %>><%= kvp.Value %><\<%=kvp.Key %>> </Connections> 
    Next 
Next 

Ich habe vage Erinnerungen an die T4-Syntax (die <% =%> -Syntax), die in der Lage ist, komplexere Operationen (anstatt direkter Zuweisung an die <% =) und ein 'Response.Write' -ähnliches Objekt zu behandeln, aber ich kann mich nicht an die Details erinnern.

2: cludgy Abhilfe

Stattdessen dachte ich ein Stringbuilder-Objekt zu bauen und seinen .ToString zum XElement zuweisen, aber das auch mit einem Konvertierungsfehler fehlgeschlagen.

Ich würde es vorziehen, weiterhin mein Schlüsselwertpaar-Konzept in Beispiel 1 oben zu verwenden, da ich das Gefühl habe, eine Zeichenfolge wie in Beispiel 2 zusammen zu koppeln, wäre ziemlich fies, und ich sollte stattdessen wieder XMLDocument verwenden.

Irgendwelche Gedanken oder Hilfe sehr geschätzt

Antwort

0

Wenn ich es richtig verstehe, was Sie zu tun versuchen, können Sie die Stringbuilder verwenden können. Verwenden Sie die StringBuilder.Append-Methode, und hängen Sie die XmlElement-Eigenschaft 'OuterXml' an.

Zum Beispiel:

sb.Append (xmlElement.OuterXml)

-2

Wir alle nachlässig wären, nicht zu erwähnen, dass dynamische XML-Elementnamen sind in der Regel eine schlechte Idee. Der ganze Sinn von XML ist ein Geschäft, das eine Datenstruktur in einer Form zu schaffen, die leicht ist:

  1. Nachweisbare
  2. Ausziehbare

Dynamische Elementnamen scheitern, dass erste Bedingung. Warum nicht einfach ein Standard-XML-Format zum Speichern von Schlüssel/Wert-Paaren wie plists verwenden?

+1

Dies sind keine dynamischen Elementnamen, die Elementnamen im Wörterbuch sind alle in einem xsd angegeben – johnc

7

VB.NET XML-Literale sind sehr mächtig, aber meistens fügen sie einige LINQ hinzu, was sie wirklich großartig macht. Dieser Code sollte genau das tun, was Sie tun möchten.

Dim Elements = New Dictionary(Of String, String) 
Elements.Add("Key1", "Value1") 
Elements.Add("Key2", "Value2") 
Elements.Add("Key3", "Value3") 

Dim xConnections = <Connections> 
         <%= From elem In Elements _ 
          Select <<%= elem.Key %>><%= elem.Value %></> %> 
        </Connections> 

Der leere schließende Tag </> ist alles, was für die VB-Compiler benötigt wird, um richtig ein XML-Element-Konstrukt, dessen Namen von einem Wert innerhalb eines <%= %> Blockes erzeugt wird.

xConnections.ToString Aufruf macht folgendes:

<Connections> 
    <Key1>Value1</Key1> 
    <Key2>Value2</Key2> 
    <Key3>Value3</Key3> 
</Connections> 
0

Um dies zu beantworten vollständiger ...

Wenn Strings Injektion in ein XML-Literal, es funktioniert nicht richtig, es sei denn, Sie verwenden XElement.Parse wenn eine XElement Injektion (dies ist, weil Sonderzeichen entgangen sind)

So Ihre ideale Lösung ist wie folgt aus:

Dim conns = connections.AsList() 
If conns IsNot Nothing AndAlso conns.length > 0 Then 
    Dim index = 0 
    Dim xConnections = _ 
     <Connections> 
      <%= From kvp As KeyValuePair(Of String, String) In conns (System.Threading.Interlocked.Increment(index)).DecompiledElements() _ 
      Select XElement.Parse("<" & <%= kvp.Key %> & ">" & <%= kvp.Value %> & "</" & <%= kvp.Key %> & ">") _ 
      %> 
     </Connections> 
    Return xConnections.ToString() 
End If 

ToString die OuterXml richtig als String zurückgeben (Wert wird nicht ...) natürlich fallen nur die ToString(), wenn Sie eine XElement von

zurückkehren möchten Da ich weiß nicht, was AsList() tut, und ich weiß auch nicht, was DecompiledElements tut, und setze deine Fehlerbehandlung dementsprechend. Es gibt auch andere Möglichkeiten, die Schleifen zu machen, dies ist nur eine Lösung.

Verwandte Themen