Я разработчик 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, если вместо этого.
Любые мысли или помощь приветствуются





Если я правильно понимаю, что вы пытаетесь сделать, вы можете использовать StringBuilder. Используйте метод StringBuilder.Append и добавьте свойство XmlElement OuterXml.
Например:
sb.Append (xmlElement.OuterXml)
Было бы упущением не упомянуть, что имена динамических XML-элементов, как правило, являются плохой идеей. Весь смысл XML состоит в том, чтобы создать хранилище структуры данных в форме, которая легко:
Имена динамических элементов не соответствуют этому первому условию. Почему бы просто не использовать стандартный формат XML для хранения пар ключ / значение, например листы?
<dict>
<key>Author</key>
<string>William Shakespeare</string>
<key>Title</key>
<string>Romeo et</string>
<key>ISBN</key>
<string>?????</string>
</dict>
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, настройте перехват ошибок соответствующим образом. Есть и другие способы делать циклы, это всего лишь одно решение.
Это вообще не имена динамических элементов, все имена элементов в словаре указаны в xsd