2008-09-09 58 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做什麼,相應地設置錯誤陷印。還有其他方法可以完成循環,這只是一個解決方案。