Использование строк в XML-литералах - PullRequest
3 голосов
/ 09 сентября 2008

Я разработчик на 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» для записи вывода к, но я не могу вспомнить детали. </p>

2: обходной путь

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

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

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

Ответы [ 4 ]

7 голосов
/ 28 апреля 2009

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

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

0 голосов
/ 09 сентября 2008

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

  1. Проверяемость
  2. Выдвижная

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

<dict>
    <key>Author</key>
    <string>William Shakespeare</string>
    <key>Title</key>
    <string>Romeo et</string>
    <key>ISBN</key>
    <string>?????</string>
</dict>
0 голосов
/ 09 сентября 2008

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

Например:

sb.append (xmlElement.OuterXml)

...