繁体   English   中英

在XML Literals中使用字符串

[英]Using strings in 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语法(<%=%>语法)的模糊记忆能够处理更复杂的操作(而不是直接赋值给<%=)和'Response.Write'这样的对象来写输出,但是我不记得细节了。

2:Cludgy解决方法

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

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

任何想法或帮助非常感谢

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>

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

将字符串注入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的作用,因此请相应地设置错误捕获。 还有其他方法可以执行循环,这只是一个解决方案。

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

例如:

sb.Append(xmlElement.OuterXml)

我们都不应该提到动态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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM