3

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

我决定尝试使用 XML Literals 来为我生成一些 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 来代替。

非常感谢任何想法或帮助

4

4 回答 4

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>
于 2009-04-28T09:09:55.010 回答
0

如果我正确理解您要执行的操作,则可以使用 StringBuilder。使用 StringBuilder.Append 方法并附加 XmlElement 'OuterXml' 属性。

例如:

sb.Append(xmlElement.OuterXml)

于 2008-09-09T00:44:06.277 回答
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 做什么,因此请相应地设置错误捕获。还有其他方法可以执行循环,这只是一种解决方案。

于 2009-06-22T17:54:58.710 回答
-2

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

  1. 可验证
  2. 可扩展

动态元素名称不符合第一个条件。为什么不简单地使用标准 XML 格式来存储诸如 plist 之类的键/值对

<dict>
    <key>Author</key>
    <string>William Shakespeare</string>
    <key>Title</key>
    <string>Romeo et</string>
    <key>ISBN</key>
    <string>?????</string>
</dict>
于 2008-09-09T06:55:36.930 回答