C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

XMLをデシリアライズした際に空白が反映しない

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■86151 / inTopicNo.1)  XMLをデシリアライズした際に空白が反映しない
  
□投稿者/ ぐちこ (1回)-(2017/12/21(Thu) 17:54:13)

分類:[VB.NET/VB2005 以降] 

初めて投稿させていただきます。

XMLをデシリアライズしてデータを加工してテキストに出力するプログラムを
作成しています。

以下の実行プログラムで以下のクラスにデシリアライズしていますが
STAFF-INFO要素の値が空白の場合デシリアライズしたclsStaffInfoクラスの
CodeがNohtingになってしまいます。もちろん空白以外の値の場合は
正常にCodeに値が入ってきます。

今回のXMLデータではSTAFF-INFO要素には半角スペース5つが登録されています。
これをそのまま取得したいのですが、何か方法はあるでしょうか?

ネットで情報を調べてStreamReaderで読んでいたところをXmlDocumentで
読むように変更して「PreserveWhitespace = True」を設定する必要が
あるとのことでしたので、そのように対応していると思うのですが
何か間違っていますでしょうか?


ご教示ください。


【XMLデータ】
<STAFF>
<STAFF-INFO startdate="20170101" enddate="20171231"> </STAFF-INFO>
<STAFF-NAME>山田 太郎</STAFF-NAME>
</STAFF>


【デシリアライズするクラス】
<System.Xml.Serialization.XmlRoot("STAFF")>
Public Class clsStaff
<System.Xml.Serialization.XmlElement("STAFF-INFO")>
Public Info As clsStaffInfo

<System.Xml.Serialization.XmlElement("STAFF-NAME")>
Public Name As String

End Class

Public Class clsStaffInfo
<System.Xml.Serialization.XmlAttribute("startdate")>
Public StartDate As String

<System.Xml.Serialization.XmlAttribute("enddate")>
Public EndDate As String

<System.Xml.Serialization.XmlText()>
Public Code As String

End Class


【デシリアライズ実行プログラム】
Private Sub DeserializeXml(ByVal asXmlFile As String)

Dim loSerializer As New Serialization.XmlSerializer(GetType(clsStaff))

Dim loDoc As New XmlDocument
loDoc.PreserveWhitespace = True
loDoc.Load(asXmlFile)

Dim loReader As New XmlNodeReader(loDoc.DocumentElement)

Dim loStaff As clsStaff = DirectCast(loSerializer.Deserialize(loReader), clsStaff)

End Sub
引用返信 編集キー/
■86158 / inTopicNo.2)  Re[1]: XMLをデシリアライズした際に空白が反映しない
□投稿者/ Hongliang (589回)-(2017/12/22(Fri) 10:20:47)
// XMLで空白文字は曲者なのでできれば近づきたくないところ。
XMLは可読性のために改行や空白を結構自由に挿入することができますが、
プログラムがXMLを扱うときにそれらを一々報告されても面倒なので、
「意味のない空白」というのをざっくり定義してそれは無視するようにします。
で、「空白文字(と子要素)しかない」部分がそれに該当します。
今回はまさにそれに該当するケースですね。
空白文字以外に何か文字が混ざっていればよかったのですが。

多分、StaffInfoにIXmlSerializableを実装して、自分で制御するしかないかなと思います。

' IXmlSerializable.ReadXmlの実装例
Dim elementName = reader.Name
Me.StartDate = reader.GetAttribute("startdate")
Me.EndDate = reader.GetAttribute("enddate")
Me.Code = reader.ReadElementContentAsString()
While reader.Read() AndAlso _
      Not(reader.NodeType = XmlNodeType.EndElement AndAlso reader.Name = elementName)
End While

引用返信 編集キー/
■86161 / inTopicNo.3)  Re[2]: XMLをデシリアライズした際に空白が反映しない
□投稿者/ ぐちこ (2回)-(2017/12/22(Fri) 10:52:06)
No86158 (Hongliang さん) に返信

Hongliangさん、返信ありがとうございます。
とても分かり易い説明ありがとうございます。理解できました。
さらに実装例までご提示いただき本当に助かりました。

実装例を参考にIXmlSerializableを実装し、うまく半角スペースを
取得できるようになりました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ