2008-09-09 130 views
3

我是一位C#开发人员,他从VB6开始编写第一个VB代码,所以如果我问的是一个相当明显的问题,请原谅我。在XML Literals中使用字符串

我决定用XML文本进行实验,以产生我一些XML代码,而不是使用的XMLDocument

我有2个问题,第二个关于解决办法,由于我无法弄清楚第一。

1:理想的解决方案

我的ElementName,ElementValue其键值对,我循环遍历动态生成的值的希望,但下面的语法死一个可怕的死亡

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对象,并到指定的XElement它的ToString,但也失败,转换错误。

我宁愿继续在上面的示例一中使用我的键值对概念,因为我觉得在上面的示例2中将字符串封在一起非常讨厌,我真的应该返回使用XMLDocument。

任何想法或帮助极大的赞赏

回答

0

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

例如:

sb.Append(xmlElement.OuterXml)

-2

我们都将是不能不提的是动态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> 
+1

这些都不是动态元素名称,字典中的元素名称都是在xsd中指定的 – johnc 2008-09-18 23:41:41

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> 
0

要回答这个问题更彻底......

当注射到字符串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做什么,相应地设置错误陷印。还有其他方法可以完成循环,这只是一个解决方案。