DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

VB.NETでヒアドキュメント。


           _________
   ∧,,∧   / 
  ミ,,゚Д゚彡 <  別言語でリベンジ。
   ミ つ旦)~~ \ 
 @ミ   ミ     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ∪''∪


Delphiでヒアドキュメントは、言語的無理なので
ビルド前に変換したりとか、異様なことをしなくちゃなんないのだけれども
(そういうことしても、かなり不完全な臭いですが)

VB.NETでは簡単にできます。

このあたりのセンスはエンバカデロさんにも学んでほしい。
むしろ、RemObjectsに学べといいたいところですが、まあ、いいか。



WPFで書いておきますが、おそらく、WinFormでもいっしょ。

こちらを参考にしてます。

VB.NETでヒアドキュメントをlogる - logる
http://d.hatena.ne.jp/qaz76/20110404/1301919478


こんな風に書きます


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
Dim element As XElement =
<test>
A
B
C
</test>

MsgBox(element.Value)
End Sub

インデントをたくさんあけているのはテストのため
ちゃんと行頭からの文字列になってくれるみたいです。

このように書いてもOK


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
Dim MessageText As String =
<test>
D
E
F
</test>.Value

MsgBox(MessageText)
End Sub


不思議な言語構造ですな。

さて、改行コードの扱いなどが気になるので
テストコードでさらに検証。

'テスト関数。
'一致すればメッセージでない、一致しなければTrace.Assert例外でメッセージ出る

Public Sub Check(ByVal A As Object, ByVal B As Object,
Optional ByVal FirstMessageText As String = "",
Optional ByVal LastMessageText As String = "")

If Not String.IsNullOrEmpty(FirstMessageText) Then
If Not FirstMessageText.EndsWith(vbCrLf) Then
FirstMessageText += vbCrLf
End If
End If
If Not String.IsNullOrEmpty(LastMessageText) Then
If Not LastMessageText.StartsWith(vbCrLf) Then
LastMessageText = vbCrLf + LastMessageText
End If
End If

Trace.Assert(A.Equals(B),
FirstMessageText +
"A=" + A.ToString + vbCrLf +
"B=" + B.ToString +
LastMessageText)
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button3.Click
Dim MessageText As String =
<string>
A
B
C
</string>.Value
Check(vbLf + "A" + vbLf + "B" + vbLf + "C" + vbLf + " ", MessageText)
End Sub

これでテスト通過でメッセージが出ません。

なんと、stringタグの直後に改行があり、そして改行がvbLF。
/stringタグの前には当然、行頭スペースも入る。
そういう仕様ですね。


個人的には、先頭の改行コード一つと、末尾のスペースはトリムしたい。


ということで、拡張関数HereString。



' ヒアドキュメント、ヒアストリングのための関数
'機能: 先頭改行除去、末端スペース除去、改行をLFからCRLF化
' を行います。
'備考: 使い方は次の通り
' HereString(<string>
' A
' B
' C
' <string>.Value)
Function HereString(ByVal s As String) As String
If s.StartsWith(vbLf) Then
s = s.Substring(1)
End If
s = s.TrimEnd(CChar(" "))
Return Replace(s, vbLf, vbCrLf)
End Function

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button4.Click
Dim s As String =
HereString(<string>
A
B
C
</string>.Value)
Check(" A" + vbCrLf + " B" + vbCrLf + " C" + vbCrLf, s)
End Sub


こんなもんで使いやすくなるかな。
スポンサーサイト

| 未分類 | 07:52 | comments:1 | trackbacks(-) | TOP↑

COMMENT

XMLかXElementsの要素制限か何かで
文字列として「&Hxxxx」という16進数表記ができないみたい。

また、何も文字列置き換えなどしていないので

HereDoc 関数 - VBA で何ちゃってヒアドキュメント | YU-TANG's MS-Access Discovery
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaHereDocuments.html

こちらの関数で実現されているのを参考に、
$1などの置き換え対応と
行末$指定での行末スペース対応
ヒアドキュメント内のコメントのために、$以降はヒアドキュメントから除外とか

そういう仕様を盛り込んでいってもいいかもしれません。

| ミ・д・ミ | 2011/12/15 12:19 | URL | ≫ EDIT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。