- 乃愛
- 会議室デビュー日: 2006/07/10
- 投稿数: 7
|
投稿日時: 2006-07-10 12:06
XMLシリアライズについての質問です。
現在XMLへシリアライズするのにXmlSerializeのSerializeメソッドを使用して行っております。
xmlに対応するクラスを作成しシリアライズしています。
属性のみを持つ要素、または要素値のみをもつ要素についてはクラスができましたが、
属性と要素値を両方持つ要素がありクラス化できませんでした。
----------------------------------------
属性のみ、または要素値のみの要素が組み合わさっている場合
コード: |
| <address country = "国">
<fullAddress>住所</fullAddress>
<zip>郵便番号</zip>
</address>
|
コード: |
| Public Class Address
' コンストラクタ
Public Sub New()
Me.objAddress = New AddressContents
End Sub
' メンバ
Private objAddress As AddressContents
' プロパティ
<XmlElement("address")> _
Public Property address() As AddressContents
Get
Return Me.objAddress
End Get
Set(ByVal Value As AddressContents)
Me.objAddress = Value
End Set
End Property
Public Class AddressContents
' コンストラクタ
Public Sub New()
End Sub
' メンバ
Private strCountry As String
Private strFullAddress As String
Private strZip As String
'プロパティ
<XmlAttributeAttribute("country")> _
Public Property country() As String
Get
Return Me.strCountry
End Get
Set(ByVal Value As String)
Me.strCountry = Value
End Set
End Property
<XmlElement("fullAddress")> _
Public Property fullAddress() As String
Get
Return Me.strFullAddress
End Get
Set(ByVal Value As String)
Me.strFullAddress = Value
End Set
End Property
<XmlElement("zip")> _
Public Property zip() As String
Get
Return Me.strZip
End Get
Set(ByVal Value As String)
Me.strZip = Value
End Set
End Property
End Class
End Class
|
この場合、期待通りのXMLを作成する事ができました。
----------------------------------------
属性と要素値をもつ要素の場合
コード: |
| <id type = "person">
000001
</Id>
|
Addressと同様に作成しようと思いましたが、うまくいきませんでした。
コード: |
|
Public Class Id
' コンストラクタ
Public Sub New()
Me.objId = New IdContents
End Sub
' メンバ
Private objId As IdContents
' プロパティ
<XmlElement("id")> _
Public Property id() As IdContents
Get
Return Me.objId
End Get
Set(ByVal Value As IdContents)
Me.objId = Value
End Set
End Property
Public Class IdContents
' コンストラクタ
Public Sub New()
End Sub
' メンバ
Private strType As String
Private strId As String
' プロパティ
<XmlAttributeAttribute("type")> _
Public Property type() As String
Get
Return Me.strType
End Get
Set(ByVal Value As String)
Me.strType = Value
End Set
End Property
<XmlElement()> _
Public Property id() As String
Get
Return Me.strId
End Get
Set(ByVal Value As String)
Me.strId = Value
End Set
End Property
End Class
End Class
|
上記Idクラスで得られるXML
コード: |
|
<id type = "person">
<id>000001</id>
</id>
|
どう修正したらよろしいでしょうか?
アドバイスよろしくお願いします。
|
- 乃愛
- 会議室デビュー日: 2006/07/10
- 投稿数: 7
|
投稿日時: 2006-07-11 08:22
全く違う方法でもあれば教えてください。
|
- かめたろ
- ぬし
- 会議室デビュー日: 2003/03/20
- 投稿数: 255
|
投稿日時: 2006-07-11 09:33
XML スキーマ定義ツール (Xsd.exe)
http://msdn2.microsoft.com/ja-jp/library/x6c1kb0s.aspx
コレ使ったらどうっすかね。
「XML から XSD へ」⇒「XSD からクラスへ」この順番で操作をすれば・・・
参考までにこちらも
http://msdn2.microsoft.com/ja-jp/library/943242d1.aspx
[ メッセージ編集済み 編集者: かめたろ 編集日時 2006-07-11 09:38 ]
|
- かめたろ
- ぬし
- 会議室デビュー日: 2003/03/20
- 投稿数: 255
|
投稿日時: 2006-07-11 10:52
一応、裏をとってみました。
@XML作る
コード: |
|
<root>
<id type = "person">000001</id>
<id type = "person">000002</id>
</root>
|
Axsdツールで xml から xsd を生成
Bxsdツールで xsd から クラス を生成
C適当なプロジェクトにBのクラスを追加し、インスタンス化して値を設定してシリアライズするコードを記述
結果
コード: |
|
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id type="person">000001</id>
<id type="person">000002</id>
</root>
|
Aで、元ネタのxmlにルート要素がちゃんとないと正しく変換されないので
-----------
間違えていたので修正しました。
Bxsdツールで xml から クラス を生成
↓
Bxsdツールで xsd から クラス を生成
[ メッセージ編集済み 編集者: かめたろ 編集日時 2006-07-11 12:39 ]
|
- 乃愛
- 会議室デビュー日: 2006/07/10
- 投稿数: 7
|
投稿日時: 2006-07-11 11:58
ありがとうございます。
やってみます。
|
- 乃愛
- 会議室デビュー日: 2006/07/10
- 投稿数: 7
|
投稿日時: 2006-07-11 19:36
ツールで作成したクラスを検証したところ属性が<XmlText()>になっていることがわかりました。
|