在XML Literals中使用字符串

时间:2008-09-09 00:05:58

标签: xml vb.net xml-literals

我是一名C#开发人员,他在自VB6以来编写的第一个VB代码中摸索着,所以如果我问一个相当明显的问题,请原谅我。

我决定尝试使用XML Literals为我生成一些XML代码,而不是使用XMLDocument

我有两个问题,第二个问题是由于我无法找出第一个问题而解决的问题。

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语法(&lt;%=%&gt;语法)的模糊记忆能够处理更复杂的操作(而不是直接分配到&lt;%=)和'Response.Write'之类的对象把输出写到,但我记不清了。

2:Cludgy workaround

相反,我考虑构建一个StringBuilder对象并将其.ToString分配给XElement,但是也因转换错误而失败。

我更愿意继续在上面的示例1中使用我的键值对概念,因为我觉得在上面的示例2中串起一个字符串是相当讨厌的,如果相反,我真的应该回到使用XMLDocument。

非常感谢任何想法或帮助

4 个答案:

答案 0 :(得分:7)

VB.NET XML Literals非常强大,但大多数情况下都会向它们添加一些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>

答案 1 :(得分:0)

如果我理解你正在尝试做什么,你可以使用StringBuilder。使用StringBuilder.Append方法并附加XmlElement'OuterXml'属性。

例如:

sb.Append(xmlElement.OuterXml)

答案 2 :(得分:0)

更完整地回答这个问题......

将字符串注入XML Literal时,除非在注入XElement时使用XElement.Parse,否则它将无法正常工作(这是因为特殊字符被转义)

所以你理想的解决方案更像是这样:

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作为字符串(值不会......) 当然,如果要返回

的XElement,只需删除ToString()

由于我不知道AsList()的作用,也不知道DecompiledElements的作用,因此请相应地设置错误捕获。还有其他方法可以执行循环,这只是一个解决方案。

答案 3 :(得分:-2)

我们都不能不提及动态XML元素名称通常是个坏主意。 XML的全部意义在于以一种易于使用的形式创建存储数据结构:

  1. 可验证
  2. 可扩展
  3. 动态元素名称失败了第一个条件。为什么不简单地使用标准XML格式来存储键值/值对,如plists

    <dict>
        <key>Author</key>
        <string>William Shakespeare</string>
        <key>Title</key>
        <string>Romeo et</string>
        <key>ISBN</key>
        <string>?????</string>
    </dict>