Использование строк в 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, если вместо этого.

Любые мысли или помощь приветствуются

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 895
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

Например:

sb.Append (xmlElement.OuterXml)

Было бы упущением не упомянуть, что имена динамических 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>

Это вообще не имена динамических элементов, все имена элементов в словаре указаны в xsd

johnc 19.09.2008 03:41

XML-литералы VB.NET очень мощные, но чаще всего добавление к ним некоторого 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, настройте перехват ошибок соответствующим образом. Есть и другие способы делать циклы, это всего лишь одно решение.

Другие вопросы по теме