Использование строк в 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, но это также не удалось из-за ошибки преобразования.

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

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


person johnc    schedule 09.09.2008    source источник


Ответы (4)


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

Например:

sb.Append (xmlElement.OuterXml)

person DaveK    schedule 09.09.2008

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>
person CoderDennis    schedule 28.04.2009

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

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

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

person Community    schedule 22.06.2009

Было бы упущением не упомянуть, что имена динамических 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>
person Frank Krueger    schedule 09.09.2008
comment
Это вообще не имена динамических элементов, имена элементов в словаре все указаны в xsd - person johnc; 19.09.2008