2008-09-09 10 views
3

私はVB6以降で書かれた最初のVBコードに悩まされているC#開発者ですから、明らかに疑問がある場合は私を許してください。 XMLリテラルで文字列を使用する

は私が回避策に関する二による最初のを把握するために私のできないことに、私は2つの質問を持っている代わりに、XMLDocumentの

を使用しての、私のためにいくつかのXMLコードを生成するために、XMLリテラルを試すことにしました。

1:理想的なソリューション

私はのElementName、そのです。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 
恐ろしい死を死ぬElementValueの辞書を持っています

私は、より複雑な操作(<%=への直接的な割り当てではなく)と出力を書き込むオブジェクトのような 'Response.Write'を扱うことができるT4構文(<10 =%>構文)私は詳細を覚えていない。

2:Cludgy回避策

は、その代わりに、私は、StringBuilderオブジェクトを構築し、XElementオブジェクトへの.ToStringを割り当てると考えるが、それはまた、変換エラーで失敗しました。

上記の例で私のキーバリューペアのコンセプトを使い続けることをお勧めします。上記の例2のように文字列を一緒に動かすと、むしろ厄介なものになります。代わりにXMLDocumentを使用することに戻ります。

任意の考えや支援が大幅に私はあなたがやろうとしているものを正しく理解していれば、あなたはStringBuilderのを使用することができます

答えて

0

を高く評価しました。 StringBuilder.Appendメソッドを使用し、XmlElementの 'OuterXml'プロパティを追加します。例えば

sb.Append(xmlElement.OuterXml)

-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> 
+1

これらは動的要素名ではありません。辞書内の要素名はすべてxsdで指定されています – johnc

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

リテラルXMLに文字列を注入するときは、XElement.Parseを使用しない限り、それが正常に動作しません...より完全

をこれに答えるために

:XElementオブジェクトを注入する際

だからあなたの理想的なソリューションは、よりこのようなものです(特殊文字がエスケープされるためです)

ToStringメソッドを使用すると、私は何を知らないので

のXElementオブジェクトを返すようにしたい場合だけ)(ToStringメソッドをドロップし、当然の (...価値がないでしょう)文字列として適切OuterXMLを返します。 AsList()はDecompiledElementsが何をしているのかわからないので、それに応じてエラートラップを設定します。ループを実行する他の方法もありますが、これはほんの一例です。

関連する問題