Использование строк в XML-литералах

Я разработчик на C#, который возится с первым VB-кодом, написанным им с VB6, поэтому, если я задаю довольно очевидный вопрос, пожалуйста, прости меня.

Я решил поэкспериментировать с XML-литералами, чтобы сгенерировать для меня некоторый XML-код вместо использования XMLDocument.

У меня есть 2 вопроса, второй относительно обходного пути из-за моей неспособности выяснить первый.

1: идеальное решение

У меня есть словарь ElementName, ElementValue, чьи пары KeyValue я зацикливался в надежде на динамическое создание значений, но следующий синтаксис умирает ужасной смертью

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

У меня есть смутные воспоминания о синтаксисе T4 (синтаксис <% =%>), позволяющем обрабатывать более сложные операции (вместо прямого назначения <% =), и объекте типа "Response.Write" для записи выходных данных, но Я не могу вспомнить детали.

2: грязный обходной путь

Вместо этого я подумал о создании объекта StringBuilder и назначении его.ToString для XElement, но это также не удалось с ошибкой преобразования.

Я бы предпочел продолжить использовать концепцию пары "ключ-значение" в приведенном выше примере, так как мне кажется, что объединение строки, как в примере 2 выше, довольно неприятно, и я действительно должен вернуться к использованию XMLDocument, если вместо этого.

Любые мысли или помощь с благодарностью

4 ответа

Решение

Если я правильно понимаю, что вы пытаетесь сделать, вы можете использовать StringBuilder. Используйте метод StringBuilder.Append и добавьте свойство XmlElement 'OuterXml'.

Например:

sb.append(xmlElement.OuterXml)

Литералы VB.NET XML очень мощные, но чаще всего добавление к ним LINQ делает их по-настоящему удивительными. Этот код должен делать именно то, что вы пытаетесь сделать.

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>

Пустой закрывающий тег </> это все, что нужно для компилятора vb, чтобы правильно построить элемент xml, имя которого генерируется из значения внутри <%= %> блок.

Вызов xConnections.ToString отображает следующее:

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

Чтобы ответить на это более полно...

При вставке строк в XML-литерал он не будет работать должным образом, если вы не используете XElement.Parse при внедрении XElement (это происходит потому, что экранируются специальные символы)

Итак, ваше идеальное решение больше похоже на это:

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 вернет OuterXML должным образом в виде строки (значение не будет...), конечно, просто отбросьте ToString(), если вы хотите вернуть XElement

Поскольку я не знаю, что делает AsList(), и при этом я не знаю, что делают DecompiledElements, соответственно установите вашу перехват ошибок. Есть и другие способы сделать циклы, это только одно решение.

Мы все были бы упущены, не говоря уже о том, что динамические имена элементов XML, как правило, плохая идея. Весь смысл XML в том, чтобы создать хранилище структуры данных в форме, которая легко:

  1. проверяемый
  2. расширяемый

Динамические имена элементов не соответствуют этому первому условию. Почему бы просто не использовать стандартный формат XML для хранения пар ключ / значение, таких как списки?

<dict>
    <key>Author</key>
    <string>William Shakespeare</string>
    <key>Title</key>
    <string>Romeo et</string>
    <key>ISBN</key>
    <string>?????</string>
</dict>
Другие вопросы по тегам