我是一名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。
非常感谢任何想法或帮助
答案 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的全部意义在于以一种易于使用的形式创建存储数据结构:
动态元素名称失败了第一个条件。为什么不简单地使用标准XML格式来存储键值/值对,如plists?
<dict>
<key>Author</key>
<string>William Shakespeare</string>
<key>Title</key>
<string>Romeo et</string>
<key>ISBN</key>
<string>?????</string>
</dict>