Utilizzando le stringhe in letterali XML

voti
3

Sono uno sviluppatore C # che sta armeggiando nel primo codice VB che ha scritto dal VB6, quindi se chiedo una domanda piuttosto ovvia, ti prego perdonami.

Ho deciso di sperimentare con letterali XML per generare codice XML per me, invece di utilizzare XMLDocument

Ho 2 domande, la seconda per quanto riguarda una soluzione a causa della mia incapacità di capire il primo.

1: Soluzione ideale

Ho un Dizionario di ElementName, elementValue cui le coppie sono stato loop sopra, nella speranza di generare i valori in modo dinamico KeyValue, ma la seguente sintassi muore di una morte orribile

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

Ho vaghi ricordi della sintassi T4 (la sintassi <% =%>) essendo in grado di gestire operazioni più complesse (anziché assegnazione al <% =) e un 'Response.Write' come oggetto per scrivere l'output, ma non riesco a ricordare i dettagli.

2: soluzione cludgy

Invece ho pensato di costruire un oggetto StringBuilder e assegnando la sua .ToString al XElement, ma che non è riuscito con un errore di conversione.

Io preferirei continuare a utilizzare la mia chiave concetto coppia di valori in precedenza ad esempio uno, come mi sento cludging insieme una stringa come nell'esempio 2 sopra è piuttosto sgradevole, e mi dovrebbe tornare a utilizzare XMLDocument se al posto.

Ogni pensiero o assistenza molto apprezzato

È pubblicato 08/09/2008 alle 23:05
fonte dall'utente
In altre lingue...                            


4 risposte

voti
0

Se ho capito bene quello che si sta cercando di fare, è possibile utilizzare lo StringBuilder. Utilizzare il metodo StringBuilder.Append e aggiungere il XmlElement proprietà 'OuterXml'.

Per esempio:

sb.Append (xmlElement.OuterXml)

Risposto il 08/09/2008 a 23:44
fonte dall'utente

voti
-2

Saremmo tutti negligente per non parlare che i nomi degli elementi XML dinamici sono generalmente una cattiva idea. Il punto di XML è quello di creare un archivio una struttura di dati in una forma che è prontamente:

  1. Verificabile
  2. Estensibile

Nomi degli elementi dinamici non riescono che prima condizione. Perché non è sufficiente utilizzare un formato XML standard per la memorizzazione coppie chiave / valore come plists ?

<dict>
    <key>Author</key>
    <string>William Shakespeare</string>
    <key>Title</key>
    <string>Romeo et</string>
    <key>ISBN</key>
    <string>?????</string>
</dict>
Risposto il 09/09/2008 a 05:55
fonte dall'utente

voti
7

VB.NET letterali XML sono molto potenti, ma più spesso l'aggiunta di qualche LINQ a loro li rende veramente impressionante. Questo codice dovrebbe fare esattamente quello che stai cercando di fare.

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>

Il tag di chiusura vuoto </>è tutto ciò che è necessario per il compilatore VB per costruire correttamente un elemento XML cui nome è generato da un valore all'interno di un <%= %>blocco.

Chiamando xConnections.ToString rende la seguente:

<Connections>
    <Key1>Value1</Key1>
    <Key2>Value2</Key2>
    <Key3>Value3</Key3>
</Connections>
Risposto il 28/04/2009 a 08:09
fonte dall'utente

voti
0

Per rispondere a questa in modo più completo ...

Quando si inietta stringhe in un letterale XML, non funzionerà correttamente a meno che non si utilizza XElement.Parse quando si inietta un XElement (questo è perché i caratteri speciali siamo scampati)

Quindi, la soluzione ideale è più simile a questo:

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 restituirà l'OuterXml correttamente come una stringa (valore non ...), ovviamente, basta semplicemente inserire il ToString () se si vuole restituire un XElement di

Dal momento che non so che cosa fa AsList (), né so cosa DecompiledElements fanno, impostare la registrazione di errore di conseguenza. Ci sono altri modi per fare i loop così, questa è solo una soluzione.

Risposto il 22/06/2009 a 16:54
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more