- PR -

XMLシリアライズ

1
投稿者投稿内容
乃愛
会議室デビュー日: 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()>になっていることがわかりました。

1

スキルアップ/キャリアアップ(JOB@IT)