3

私はC#開発者であり、VB6以降に作成された最初のVBコードをいじくり回しているので、かなり明白な質問をしている場合は、ご容赦ください。

XMLDocumentを使用する代わりに、XMLLiteralsを試してXMLコードを生成することにしました。

2つの質問があります。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に割り当てることを考えましたが、変換エラーで失敗しました。

上記の例2のように文字列をまとめるのはかなり厄介だと感じるので、上記の例1のキーと値のペアの概念を引き続き使用したいと思います。代わりに、XMLDocumentの使用に戻る必要があります。

どんな考えや援助も大歓迎です

4

4 に答える 4

7

VB.NET XML リテラルは非常に強力ですが、ほとんどの場合、それに何らかの 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>

ブロック</>内の値から名前が生成される xml 要素を vb コンパイラが適切に構築するために必要なのは、空の終了タグだけです。<%= %>

xConnections.ToString を呼び出すと、以下がレンダリングされます。

<Connections>
    <Key1>Value1</Key1>
    <Key2>Value2</Key2>
    <Key3>Value3</Key3>
</Connections>
于 2009-04-28T09:09:55.010 に答える
0

これにもっと完全に答えるために...

XMLリテラルに文字列を挿入する場合、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が何をするのかわからないので、それに応じてエラートラップを設定します。ループを実行する方法は他にもありますが、これは1つの解決策にすぎません。

于 2009-06-22T17:54:58.710 に答える
0

あなたがしようとしていることを正しく理解していれば、StringBuilder を使用できます。StringBuilder.Append メソッドを使用して、XmlElement 'OuterXml' プロパティを追加します。

例えば:

sb.Append(xmlElement.OuterXml)

于 2008-09-09T00:44:06.277 に答える
-2

動的な XML 要素名は一般的に悪い考えであることは言うまでもありません。XML の要点は、次のような形式でデータ構造を格納することです。

  1. 検証可能
  2. 拡張可能

動的要素名は、最初の条件に失敗します。plistsのようなキーと値のペアを保存するために、単純に標準の XML 形式を使用しないのはなぜですか?

<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 に答える